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

Reply via email to