Gilad Chaplik has uploaded a new change for review. Change subject: db, core: aggregate qos and storage qos impl ......................................................................
db, core: aggregate qos and storage qos impl - DB and DAL changes: create qos table to accomodate qos objects and include storage qos and its limits. - added qos_sp.sql to add default sp. For more information see: http://www.ovirt.org/Features/aggregate_QoS, http://www.ovirt.org/Features/blkio-support Change-Id: I1a9af59277b5055453159f002f19046c0051d63b Signed-off-by: Gilad Chaplik <[email protected]> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosBaseDaoFacadeImpl.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDaoDbFacadeImpl.java M backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java A backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/qos/StorageQosDaoTest.java M backend/manager/modules/dal/src/test/resources/fixtures.xml A packaging/dbscripts/qos_sp.sql A packaging/dbscripts/upgrade/03_05_0940_add_qos_table.sql M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 16 files changed, 438 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/04/31804/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java index ace8350..cfd143d 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java @@ -190,6 +190,15 @@ return supportedInConfig(ConfigValues.NetworkQosSupported, version); } + /** + * @param version + * Compatibility version to check for. + * @return <code>true</code> iff Storage QoS is supported for the cluster version. + */ + public static boolean storageQoS(Version version) { + return supportedInConfig(ConfigValues.StorageQosSupported, version); + } + public static boolean hostNetworkQos(Version version) { return supportedInConfig(ConfigValues.HostNetworkQosSupported, version); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java index 1c0c5a6..9869611 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java @@ -1602,6 +1602,10 @@ @TypeConverterAttribute(Boolean.class) @DefaultValueAttribute("true") + StorageQosSupported, + + @TypeConverterAttribute(Boolean.class) + @DefaultValueAttribute("true") HostNetworkQosSupported, @TypeConverterAttribute(Boolean.class) diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java index c84880e..1c53536 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java @@ -98,11 +98,12 @@ PreDefinedNetworkCustomProperties, UserDefinedNetworkCustomProperties, MultipleGatewaysSupported, - HostNetworkQosSupported, VirtIoScsiEnabled(ConfigAuthType.User), OvfStoreOnAnyDomain, SshSoftFencingCommand, MemorySnapshotSupported(ConfigAuthType.User), + HostNetworkQosSupported, + StorageQosSupported, MaxAverageNetworkQoSValue, MaxPeakNetworkQoSValue, MaxBurstNetworkQoSValue, 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 d3a4e9e..4ae2eac 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 @@ -138,6 +138,7 @@ import org.ovirt.engine.core.dao.network.VnicProfileDao; import org.ovirt.engine.core.dao.network.VnicProfileViewDao; import org.ovirt.engine.core.dao.provider.ProviderDao; +import org.ovirt.engine.core.dao.qos.StorageQosDao; import org.ovirt.engine.core.dao.scheduling.AffinityGroupDao; import org.ovirt.engine.core.dao.scheduling.ClusterPolicyDao; import org.ovirt.engine.core.dao.scheduling.PolicyUnitDao; @@ -964,6 +965,10 @@ return getDao(NetworkQoSDao.class); } + public StorageQosDao getStorageQosDao() { + return getDao(StorageQosDao.class); + } + /** * Returns the singleton instance of {@link PolicyUnitDao}. * diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java index b17fc06..f0214b6 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java @@ -124,6 +124,18 @@ } /** + * Returns a Integer or a null if the column was NULL. + * @param resultSet the ResultSet to extract the result from + * @param columnName + * @return a Integer or null + * @throws SQLException + */ + protected final static Integer getInteger(ResultSet resultSet, String columnName) throws SQLException { + Integer value = resultSet.getInt(columnName); + return resultSet.wasNull() ? null : value; + } + + /** * Returns a {@link Guid} representing the column's value or a default value if the column was <code>null</code>. * * <b>Note:</b> Postgres' driver returns a {@link UUID} when {@link ResultSet#getObject(String)} is called on a diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosBaseDaoFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosBaseDaoFacadeImpl.java new file mode 100644 index 0000000..cf1eef5 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosBaseDaoFacadeImpl.java @@ -0,0 +1,69 @@ +package org.ovirt.engine.core.dao.qos; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.qos.QosBase; +import org.ovirt.engine.core.common.businessentities.qos.QosType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.DefaultGenericDaoDbFacade; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; + +public abstract class QosBaseDaoFacadeImpl<T extends QosBase> extends DefaultGenericDaoDbFacade<T, Guid> implements QosDao<T> { + private final QosType qosType; + + public QosBaseDaoFacadeImpl(QosType qosType) { + super("qos"); + this.qosType = qosType; + } + + /** + * @return qos type for derived qos dao + */ + protected QosType getQosType() { + return qosType; + } + + @Override + public List<T> getAllForStoragePoolId(Guid storagePoolId) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("storage_pool_id", storagePoolId.getUuid()) + .addValue("qos_type", getQosType()); + return getCallsHandler().executeReadList("GetAllQosForStoragePoolByQosType", + createEntityRowMapper(), + parameterSource); + } + + @Override + protected MapSqlParameterSource createFullParametersMapper(T obj) { + MapSqlParameterSource map = createIdParameterMapper(obj.getId()) + .addValue("qos_type", getQosType()) + .addValue("name", obj.getName()) + .addValue("description", obj.getDescription()) + .addValue("storage_pool_id", obj.getStoragePoolId()); + return map; + } + + @Override + protected MapSqlParameterSource createIdParameterMapper(Guid guid) { + return getCustomMapSqlParameterSource() + .addValue("id", guid); + } + + protected static abstract class QosBaseDaoFacadaeImplMapper<M extends QosBase> implements RowMapper<M> { + @Override + public M mapRow(ResultSet rs, int rowNum) throws SQLException { + M entity = createQosEntity(rs); + entity.setId(getGuid(rs, "id")); + entity.setName(rs.getString("name")); + entity.setStoragePoolId(getGuid(rs, "storage_pool_id")); + entity.setDescription(rs.getString("description")); + return entity; + } + + protected abstract M createQosEntity(ResultSet rs) throws SQLException; + } + +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosDao.java new file mode 100644 index 0000000..c146092 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/QosDao.java @@ -0,0 +1,12 @@ +package org.ovirt.engine.core.dao.qos; + +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.qos.QosBase; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.GenericDao; + +public interface QosDao<T extends QosBase> extends GenericDao<T, Guid> { + + public List<T> getAllForStoragePoolId(Guid storagePoolId); +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDao.java new file mode 100644 index 0000000..42e9391 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDao.java @@ -0,0 +1,6 @@ +package org.ovirt.engine.core.dao.qos; + +import org.ovirt.engine.core.common.businessentities.qos.StorageQos; + +public interface StorageQosDao extends QosDao<StorageQos> { +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDaoDbFacadeImpl.java new file mode 100644 index 0000000..b881a8f --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/qos/StorageQosDaoDbFacadeImpl.java @@ -0,0 +1,51 @@ +package org.ovirt.engine.core.dao.qos; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.ovirt.engine.core.common.businessentities.qos.QosType; +import org.ovirt.engine.core.common.businessentities.qos.StorageQos; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; + +public class StorageQosDaoDbFacadeImpl extends QosBaseDaoFacadeImpl<StorageQos> implements StorageQosDao { + private static final StorageDaoDbFacadaeImplMapper MAPPER = new StorageDaoDbFacadaeImplMapper(); + + public StorageQosDaoDbFacadeImpl() { + super(QosType.STORAGE); + } + + @Override + protected MapSqlParameterSource createFullParametersMapper(StorageQos obj) { + MapSqlParameterSource map = super.createFullParametersMapper(obj); + map.addValue("max_throughput", obj.getMaxThroughput()); + map.addValue("max_read_throughput", obj.getMaxReadThroughput()); + map.addValue("max_write_throughput", obj.getMaxWriteThroughput()); + map.addValue("max_iops", obj.getMaxIops()); + map.addValue("max_read_iops", obj.getMaxReadIops()); + map.addValue("max_write_iops", obj.getMaxWriteIops()); + + return map; + } + + @Override + protected RowMapper<StorageQos> createEntityRowMapper() { + return MAPPER; + } + + protected static class StorageDaoDbFacadaeImplMapper extends QosBaseDaoFacadaeImplMapper<StorageQos> { + + @Override + protected StorageQos createQosEntity(ResultSet rs) throws SQLException { + StorageQos entity = new StorageQos(); + entity.setMaxThroughput(getInteger(rs, "max_throughput")); + entity.setMaxReadThroughput(getInteger(rs, "max_read_throughput")); + entity.setMaxWriteThroughput(getInteger(rs, "max_write_throughput")); + entity.setMaxIops(getInteger(rs, "max_iops")); + entity.setMaxReadIops(getInteger(rs, "max_read_iops")); + entity.setMaxWriteIops(getInteger(rs, "max_write_iops")); + return entity; + } + } + +} 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 7ad4ff5..e1a52d2 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 @@ -69,6 +69,7 @@ GlusterClusterServiceDao=org.ovirt.engine.core.dao.gluster.GlusterClusterServiceDaoDbFacadeImpl GlusterServerDao=org.ovirt.engine.core.dao.gluster.GlusterServerDaoDbFacadeImpl NetworkQoSDao=org.ovirt.engine.core.dao.network.NetworkQoSDaoFacadeImpl +StorageQosDao=org.ovirt.engine.core.dao.qos.StorageQosDaoDbFacadeImpl PolicyUnitDao=org.ovirt.engine.core.dao.scheduling.PolicyUnitDaoImpl ClusterPolicyDao=org.ovirt.engine.core.dao.scheduling.ClusterPolicyDaoImpl DwhHistoryTimekeepingDao=org.ovirt.engine.core.dao.dwh.DwhHistoryTimekeepingDaoDbFacadeImpl 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 0efece3..fb06a08 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 @@ -611,6 +611,15 @@ public static final Guid EXISTING_COMMAND_ENTITY_ID = new Guid("340fd52b-3400-4cdd-8d3f-c9d03704b0a1"); /** + * UUIDs for QoS objects + */ + public static final Guid QOS_ID_1 = new Guid("ae956031-6be2-43d6-bb90-5191c9253314"); + + public static final Guid QOS_ID_2 = new Guid("ae956031-6be2-43d6-bb90-5191c9253315"); + + public static final Guid QOS_ID_3 = new Guid("ae956031-6be2-43d6-bb90-5191c9253316"); + + /** * Number of VMs on clusters */ public static final int NUMBER_OF_VMS_IN_VDS_GROUP_RHEL6_NFS_CLUSTER = 0; diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/qos/StorageQosDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/qos/StorageQosDaoTest.java new file mode 100644 index 0000000..ba7b3e1 --- /dev/null +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/qos/StorageQosDaoTest.java @@ -0,0 +1,100 @@ +package org.ovirt.engine.core.dao.qos; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.util.List; + +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.qos.StorageQos; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.BaseDAOTestCase; +import org.ovirt.engine.core.dao.FixturesTool; + +public class StorageQosDaoTest extends BaseDAOTestCase { + + private final StorageQosDao dao = getDbFacade().getStorageQosDao(); + + /** + * Ensures that retrieving with an invalid ID returns null. + */ + @Test + public void testGetWithInvalidId() { + assertNull(dao.get(Guid.newGuid())); + } + + @Test + public void getStorageQos() { + StorageQos storageQos = new StorageQos(); + storageQos.setId(FixturesTool.QOS_ID_1); + storageQos.setName("qos_a"); + storageQos.setDescription("You don't understand. There's relationship George, and then there's the George you know. Baudy George, Funny George"); + storageQos.setStoragePoolId(FixturesTool.STORAGE_POOL_MIXED_TYPES); + storageQos.setMaxThroughput(1000); + storageQos.setMaxReadThroughput(2000); + storageQos.setMaxWriteThroughput(500); + storageQos.setMaxIops(1000); + storageQos.setMaxReadIops(2000); + storageQos.setMaxWriteIops(500); + + StorageQos fetched = dao.get(FixturesTool.QOS_ID_1); + assertNotNull(fetched); + assertEquals(storageQos, fetched); + } + + @Test + public void updateStorageQos() { + StorageQos storageQos = dao.get(FixturesTool.QOS_ID_2); + assertNotNull(storageQos); + storageQos.setName("newB"); + storageQos.setDescription("If I owned a company, my employees would love me. They’d have huge pictures of me up the walls and in their home, like Lenin."); + storageQos.setMaxThroughput(30); + storageQos.setMaxReadThroughput(30); + storageQos.setMaxWriteThroughput(30); + storageQos.setMaxIops(30); + storageQos.setMaxReadIops(30); + storageQos.setMaxWriteIops(30); + assertFalse(storageQos.equals(dao.get(FixturesTool.QOS_ID_2))); + dao.update(storageQos); + StorageQos fetched = dao.get(FixturesTool.QOS_ID_2); + assertNotNull(fetched); + assertEquals(storageQos, fetched); + } + + @Test + public void removeStorageQos() { + assertNotNull(dao.get(FixturesTool.QOS_ID_3)); + dao.remove(FixturesTool.QOS_ID_3); + assertNull(dao.get(FixturesTool.QOS_ID_3)); + } + + @Test + public void saveStorageQos() { + StorageQos storageQos = new StorageQos(); + storageQos.setId(Guid.newGuid()); + assertNull(dao.get(storageQos.getId())); + storageQos.setName("qos_d"); + storageQos.setDescription("bla bla"); + storageQos.setStoragePoolId(FixturesTool.STORAGE_POOL_MIXED_TYPES); + storageQos.setMaxThroughput(200); + storageQos.setMaxReadThroughput(200); + storageQos.setMaxWriteThroughput(200); + storageQos.setMaxIops(200); + storageQos.setMaxReadIops(200); + storageQos.setMaxWriteIops(200); + dao.save(storageQos); + StorageQos fetched = dao.get(storageQos.getId()); + assertNotNull(fetched); + assertEquals(storageQos, fetched); + } + + @Test + public void getAllStorageQosForStoragePool() { + List<StorageQos> allForStoragePoolId = dao.getAllForStoragePoolId(FixturesTool.STORAGE_POOL_MIXED_TYPES); + assertNotNull(allForStoragePoolId); + assertEquals(2, allForStoragePoolId.size()); + } + +} diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 4454a67..0e3d742 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -1147,6 +1147,59 @@ </row> </table> + <table name="qos"> + <column>id</column> + <column>qos_type</column> + <column>name</column> + <column>description</column> + <column>storage_pool_id</column> + <column>max_throughput</column> + <column>max_read_throughput</column> + <column>max_write_throughput</column> + <column>max_iops</column> + <column>max_read_iops</column> + <column>max_write_iops</column> + <row> + <value>ae956031-6be2-43d6-bb90-5191c9253314</value> + <value>1</value> + <value>qos_a</value> + <value>You don't understand. There's relationship George, and then there's the George you know. Baudy George, Funny George</value> + <value>386bffd1-e7ed-4b08-bce9-d7df10f8c9a0</value> + <value>1000</value> + <value>2000</value> + <value>500</value> + <value>1000</value> + <value>2000</value> + <value>500</value> + </row> + <row> + <value>ae956031-6be2-43d6-bb90-5191c9253315</value> + <value>1</value> + <value>qos_b</value> + <value>If I owned a company, my employees would love me. They’d have huge pictures of me up the walls and in their home, like Lenin.</value> + <value>386bffd1-e7ed-4b08-bce9-d7df10f8c9a0</value> + <value>1200</value> + <value>2400</value> + <value>500</value> + <value>1200</value> + <value>2400</value> + <value>500</value> + </row> + <row> + <value>ae956031-6be2-43d6-bb90-5191c9253316</value> + <value>1</value> + <value>qos_c</value> + <value>Jerry, just remember, it’s not a lie if you believe it.</value> + <value>72b9e200-f48b-4687-83f2-62828f249a47</value> + <value>700</value> + <value>1400</value> + <value>500</value> + <value>700</value> + <value>1400</value> + <value>500</value> + </row> + </table> + <table name="vnic_profiles"> <column>id</column> <column>name</column> diff --git a/packaging/dbscripts/qos_sp.sql b/packaging/dbscripts/qos_sp.sql new file mode 100644 index 0000000..bbdaca6 --- /dev/null +++ b/packaging/dbscripts/qos_sp.sql @@ -0,0 +1,72 @@ +---------------------------------------------------------------- +-- [qos] Table +---------------------------------------------------------------- + +Create or replace FUNCTION InsertQos(v_id uuid, + v_qos_type SMALLINT, + v_name VARCHAR(50), + v_description TEXT, + v_storage_pool_id uuid, + v_max_throughput INTEGER, + v_max_read_throughput INTEGER, + v_max_write_throughput INTEGER, + v_max_iops INTEGER, + v_max_read_iops INTEGER, + v_max_write_iops INTEGER) +RETURNS VOID + AS $procedure$ +BEGIN +INSERT INTO qos(id, qos_type, name, description, storage_pool_id, max_throughput, max_read_throughput, max_write_throughput, max_iops, max_read_iops, max_write_iops) + VALUES(v_id, v_qos_type, v_name, v_description, v_storage_pool_id, v_max_throughput, v_max_read_throughput, v_max_write_throughput, v_max_iops, v_max_read_iops, v_max_write_iops); +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION UpdateQos(v_id uuid, + v_qos_type SMALLINT, + v_name VARCHAR(50), + v_description TEXT, + v_storage_pool_id uuid, + v_max_throughput INTEGER, + v_max_read_throughput INTEGER, + v_max_write_throughput INTEGER, + v_max_iops INTEGER, + v_max_read_iops INTEGER, + v_max_write_iops INTEGER) +RETURNS VOID + AS $procedure$ +BEGIN + UPDATE qos + SET qos_type = v_qos_type, name = v_name, description = v_description, storage_pool_id = v_storage_pool_id, max_throughput = v_max_throughput, max_read_throughput = v_max_read_throughput, + max_write_throughput = v_max_write_throughput, max_iops = v_max_iops, max_read_iops = v_max_read_iops, max_write_iops = v_max_write_iops, + _update_date = LOCALTIMESTAMP + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION DeleteQos(v_id UUID) RETURNS VOID + AS $procedure$ +BEGIN + DELETE FROM qos + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetQosByQosId(v_id UUID) RETURNS SETOF qos STABLE + AS $procedure$ +BEGIN +RETURN QUERY SELECT * + FROM qos + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetAllQosForStoragePoolByQosType(v_storage_pool_id UUID, v_qos_type SMALLINT) RETURNS SETOF qos STABLE + AS $procedure$ +BEGIN +RETURN QUERY SELECT * + FROM qos + WHERE storage_pool_id = v_storage_pool_id + AND qos_type = v_qos_type; +END; $procedure$ +LANGUAGE plpgsql; + diff --git a/packaging/dbscripts/upgrade/03_05_0940_add_qos_table.sql b/packaging/dbscripts/upgrade/03_05_0940_add_qos_table.sql new file mode 100644 index 0000000..5db0e37 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_05_0940_add_qos_table.sql @@ -0,0 +1,29 @@ +-- ---------------------------------------------------------------------- +-- table qos +-- ---------------------------------------------------------------------- + +CREATE TABLE qos +( + id uuid NOT NULL, + qos_type SMALLINT NOT NULL, + name VARCHAR(50) NOT NULL, + description TEXT, + storage_pool_id uuid NOT NULL, + max_throughput INTEGER, + max_read_throughput INTEGER, + max_write_throughput INTEGER, + max_iops INTEGER, + max_read_iops INTEGER, + max_write_iops INTEGER, + _create_date TIMESTAMP WITH TIME ZONE default LOCALTIMESTAMP, + _update_date TIMESTAMP WITH TIME ZONE default NULL, + CONSTRAINT PK_qos_id PRIMARY KEY (id) +) WITH OIDS; + +ALTER TABLE qos ADD CONSTRAINT fk_qos_storage_pool FOREIGN KEY (storage_pool_id) + REFERENCES storage_pool (id) + ON UPDATE NO ACTION ON DELETE CASCADE; + +-- add index on storage_pool_id +CREATE INDEX IDX_qos_storage_pool_id ON qos (storage_pool_id); + diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql index 98325331..e54c1f3 100644 --- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql +++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql @@ -236,6 +236,10 @@ select fn_db_add_config_value('NetworkQosSupported','false','3.0'); select fn_db_add_config_value('NetworkQosSupported','false','3.1'); select fn_db_add_config_value('NetworkQosSupported','false','3.2'); +select fn_db_add_config_value('StorageQosSupported','false','3.0'); +select fn_db_add_config_value('StorageQosSupported','false','3.1'); +select fn_db_add_config_value('StorageQosSupported','false','3.3'); +select fn_db_add_config_value('StorageQosSupported','false','3.4'); select fn_db_add_config_value('HostNetworkQosSupported', 'false', '3.0'); select fn_db_add_config_value('HostNetworkQosSupported', 'false', '3.1'); select fn_db_add_config_value('HostNetworkQosSupported', 'false', '3.2'); -- To view, visit http://gerrit.ovirt.org/31804 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1a9af59277b5055453159f002f19046c0051d63b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Gilad Chaplik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
