Merge "Adding status field to image location -- DB migration"

This commit is contained in:
Jenkins 2014-02-13 12:15:11 +00:00 committed by Gerrit Code Review
commit 31253812f5
3 changed files with 106 additions and 0 deletions

View File

@ -0,0 +1,52 @@
# Copyright 2014 IBM Corp.
#
# 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.
import sqlalchemy
from glance.db.sqlalchemy.migrate_repo import schema
def upgrade(migrate_engine):
meta = sqlalchemy.schema.MetaData()
meta.bind = migrate_engine
images_table = sqlalchemy.Table('images', meta, autoload=True)
image_locations_table = sqlalchemy.Table('image_locations', meta,
autoload=True)
# Create 'status' column for image_locations table
status = sqlalchemy.Column('status', schema.String(30),
server_default='active', nullable=False)
status.create(image_locations_table)
# Set 'status' column initial value for image_locations table
mapping = {'active': 'active', 'pending_delete': 'pending_delete',
'deleted': 'deleted', 'killed': 'deleted'}
for src, dst in mapping.iteritems():
subq = sqlalchemy.sql.select([images_table.c.id])\
.where(images_table.c.status == src)
image_locations_table.update(values={'status': dst})\
.where(image_locations_table.c.image_id.in_(subq))\
.execute()
def downgrade(migrate_engine):
meta = sqlalchemy.schema.MetaData()
meta.bind = migrate_engine
image_locations_table = sqlalchemy.Table('image_locations', meta,
autoload=True)
# Remove 'status' column from image_locations table
image_locations_table.columns['status'].drop()

View File

@ -178,6 +178,7 @@ class ImageLocation(BASE, GlanceBase):
image = relationship(Image, backref=backref('locations'))
value = Column(Text(), nullable=False)
meta_data = Column(JSONEncodedDict(), default={})
status = Column(String(30), default='active', nullable=False)
class ImageMember(BASE, GlanceBase):

View File

@ -1172,3 +1172,56 @@ class TestMigrations(test_utils.BaseTestCase):
self.assertIsNone(task_2.input)
self.assertIsNone(task_2.result)
self.assertIsNone(task_2.message)
def _pre_upgrade_033(self, engine):
images = get_table(engine, 'images')
image_locations = get_table(engine, 'image_locations')
now = datetime.datetime.now()
image_id = 'fake_id_028_%d'
url = 'file:///some/place/onthe/fs_%d'
status_list = ['active', 'saving', 'queued', 'killed',
'pending_delete', 'deleted']
image_id_list = []
for (idx, status) in enumerate(status_list):
temp = dict(deleted=False,
created_at=now,
updated_at=now,
status=status,
is_public=True,
min_disk=0,
min_ram=0,
id=image_id % idx)
images.insert().values(temp).execute()
temp = dict(deleted=False,
created_at=now,
updated_at=now,
image_id=image_id % idx,
value=url % idx)
image_locations.insert().values(temp).execute()
image_id_list.append(image_id % idx)
return image_id_list
def _check_033(self, engine, data):
image_locations = get_table(engine, 'image_locations')
self.assertIn('status', image_locations.c)
self.assertEqual(image_locations.c['status'].type.length, 30)
status_list = ['active', 'active', 'active',
'deleted', 'pending_delete', 'deleted']
for (idx, image_id) in enumerate(data):
results = image_locations.select()\
.where(image_locations.c.image_id == image_id).execute()
r = list(results)
self.assertEqual(len(r), 1)
self.assertTrue('status' in r[0])
self.assertEqual(r[0]['status'], status_list[idx])
def _post_downgrade_033(self, engine):
image_locations = get_table(engine, 'image_locations')
self.assertNotIn('status', image_locations.c)