From 8c6fec417424874094027f486f5d9f1a21492109 Mon Sep 17 00:00:00 2001
From: Vilobh Meshram <vilobhmm@yahoo-inc.com>
Date: Fri, 19 Jun 2015 10:17:07 -0700
Subject: [PATCH] Nested Quota : Create allocated column in cinder.quotas

Create allocated column in cinder.quotas. This allocated
column will be the sum of "hard_limits" values for the
immediate child projects. This will be needed to track
allocated quota to child projects.

Change-Id: Ia80d9a6cdbbc7e86cf9f11979f5e80c53f0fac1f
Implements: bp cinder-nested-quota-driver
---
 .../versions/048_add_allocated_in_quotas.py   | 34 +++++++++++++++++++
 cinder/db/sqlalchemy/models.py                |  1 +
 cinder/tests/unit/test_migrations.py          |  9 +++++
 3 files changed, 44 insertions(+)
 create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/048_add_allocated_in_quotas.py

diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/048_add_allocated_in_quotas.py b/cinder/db/sqlalchemy/migrate_repo/versions/048_add_allocated_in_quotas.py
new file mode 100644
index 000000000..372236426
--- /dev/null
+++ b/cinder/db/sqlalchemy/migrate_repo/versions/048_add_allocated_in_quotas.py
@@ -0,0 +1,34 @@
+# Copyright 2015 Yahoo Inc.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from sqlalchemy import Column, Integer, MetaData, Table
+
+
+def upgrade(migrate_engine):
+    meta = MetaData()
+    meta.bind = migrate_engine
+    quotas = Table('quotas', meta, autoload=True)
+
+    # Add a new column allocated to save allocated quota
+    allocated = Column('allocated', Integer, default=0)
+    quotas.create_column(allocated)
+
+
+def downgrade(migrate_engine):
+    """Remove allocated column from quotas."""
+    meta = MetaData()
+    meta.bind = migrate_engine
+
+    quotas = Table('quotas', meta, autoload=True)
+    quotas.drop_column('allocated')
diff --git a/cinder/db/sqlalchemy/models.py b/cinder/db/sqlalchemy/models.py
index 989fd8401..ac42008c5 100644
--- a/cinder/db/sqlalchemy/models.py
+++ b/cinder/db/sqlalchemy/models.py
@@ -366,6 +366,7 @@ class Quota(BASE, CinderBase):
 
     resource = Column(String(255))
     hard_limit = Column(Integer, nullable=True)
+    allocated = Column(Integer, default=0)
 
 
 class QuotaClass(BASE, CinderBase):
diff --git a/cinder/tests/unit/test_migrations.py b/cinder/tests/unit/test_migrations.py
index 7028777a2..57aae6482 100644
--- a/cinder/tests/unit/test_migrations.py
+++ b/cinder/tests/unit/test_migrations.py
@@ -817,6 +817,15 @@ class MigrationsMixin(test_migrations.WalkVersionsMixin):
         services = db_utils.get_table(engine, 'services')
         self.assertNotIn('modified_at', services.c)
 
+    def _check_048(self, engine, data):
+        quotas = db_utils.get_table(engine, 'quotas')
+        self.assertIsInstance(quotas.c.allocated.type,
+                              sqlalchemy.types.INTEGER)
+
+    def _post_downgrade_048(self, engine):
+        quotas = db_utils.get_table(engine, 'quotas')
+        self.assertNotIn('allocated', quotas.c)
+
     def test_walk_versions(self):
         self.walk_versions(True, False)
 
-- 
2.45.2