1
Description: Fix tests failing with sqlalachemy 0.7.9
2
Author: Chuck Short <zulcss@ubuntu.com>
4
diff -Naurp nova-2013.2.a2028.gd612ed9.orig/nova/db/sqlalchemy/migrate_repo/versions/186_new_bdm_format.py nova-2013.2.a2028.gd612ed9/nova/db/sqlalchemy/migrate_repo/versions/186_new_bdm_format.py
5
--- nova-2013.2.a2028.gd612ed9.orig/nova/db/sqlalchemy/migrate_repo/versions/186_new_bdm_format.py 2013-07-16 09:01:23.000000000 -0400
6
+++ nova-2013.2.a2028.gd612ed9/nova/db/sqlalchemy/migrate_repo/versions/186_new_bdm_format.py 2013-07-16 10:49:47.661898868 -0400
7
@@ -249,12 +249,9 @@ def _downgrade_bdm_v2(meta, bdm_table):
8
(bdm_table.c.source_type == 'blank')
9
).order_by(bdm_table.c.id.asc())
12
- dict(zip(('id', 'source', 'format'), row))
13
- for row in bdm_q.execute().fetchall()
15
+ blanks = [dict(row) for row in bdm_q.execute().fetchall()]
17
- swap = [dev for dev in blanks if dev['format'] == 'swap']
18
+ swap = [dev for dev in blanks if dev['guest_format'] == 'swap']
20
ephemerals = [dev for dev in blanks if dev not in swap]
22
diff -Naurp nova-2013.2.a2028.gd612ed9.orig/nova/db/sqlalchemy/types.py nova-2013.2.a2028.gd612ed9/nova/db/sqlalchemy/types.py
23
--- nova-2013.2.a2028.gd612ed9.orig/nova/db/sqlalchemy/types.py 2013-07-16 09:01:23.000000000 -0400
24
+++ nova-2013.2.a2028.gd612ed9/nova/db/sqlalchemy/types.py 2013-07-16 10:49:40.465898696 -0400
25
@@ -25,7 +25,14 @@ from nova import utils
27
class IPAddress(types.TypeDecorator):
28
"""An SQLAlchemy type representing an IP-address."""
29
- impl = types.String(39).with_variant(postgresql.INET(), 'postgresql')
33
+ def load_dialect_impl(self, dialect):
34
+ if dialect.name == 'postgresql':
35
+ return dialect.type_descriptor(postgresql.INET())
37
+ return dialect.type_descriptor(types.String(39))
39
def process_bind_param(self, value, dialect):
40
"""Process/Formats the value before insert it into the db."""
41
@@ -40,7 +47,14 @@ class IPAddress(types.TypeDecorator):
43
class CIDR(types.TypeDecorator):
44
"""An SQLAlchemy type representing a CIDR definition."""
45
- impl = types.String(43).with_variant(postgresql.INET(), 'postgresql')
49
+ def load_dialect_impl(self, dialect):
50
+ if dialect.name == 'postgresql':
51
+ return dialect.type_descriptor(postgresql.INET())
53
+ return dialect.type_descriptor(types.String(43))
55
def process_bind_param(self, value, dialect):
56
"""Process/Formats the value before insert it into the db."""
57
diff -Naurp nova-2013.2.a2028.gd612ed9.orig/nova/tests/db/test_migrations.py nova-2013.2.a2028.gd612ed9/nova/tests/db/test_migrations.py
58
--- nova-2013.2.a2028.gd612ed9.orig/nova/tests/db/test_migrations.py 2013-07-16 09:01:23.000000000 -0400
59
+++ nova-2013.2.a2028.gd612ed9/nova/tests/db/test_migrations.py 2013-07-16 10:49:47.661898868 -0400
60
@@ -46,6 +46,7 @@ import commands
68
@@ -64,6 +65,7 @@ from nova.openstack.common import log as
69
from nova.openstack.common import timeutils
70
from nova.openstack.common import uuidutils
72
+from nova.tests import matchers
73
from nova import utils
74
import nova.virt.baremetal.db.sqlalchemy.migrate_repo
76
@@ -1466,7 +1468,7 @@ class TestNovaMigrations(BaseMigrationTe
77
self._unique_constraint_check_migrate_185(engine)
79
def _pre_upgrade_186(self, engine):
81
+ self.mig186_fake_instances = [
82
dict(uuid='mig186_uuid-1', image_ref='fake_image_1',
83
root_device_name='/dev/vda'),
84
dict(uuid='mig186_uuid-2', image_ref='',
85
@@ -1475,7 +1477,7 @@ class TestNovaMigrations(BaseMigrationTe
86
root_device_name='/dev/vda'),
90
+ self.mig186_fake_bdms = [
91
# Instance 1 - image, volume and swap
92
dict(instance_uuid='mig186_uuid-1', device_name='/dev/vdc',
93
volume_id='fake_volume_1'),
94
@@ -1497,11 +1499,11 @@ class TestNovaMigrations(BaseMigrationTe
96
instances = db_utils.get_table(engine, 'instances')
97
block_device = db_utils.get_table(engine, 'block_device_mapping')
98
- engine.execute(instances.insert(), fake_instances)
99
- for fake_bdm in fake_bdms:
100
+ engine.execute(instances.insert(), self.mig186_fake_instances)
101
+ for fake_bdm in self.mig186_fake_bdms:
102
engine.execute(block_device.insert(), fake_bdm)
104
- return fake_instances, fake_bdms
105
+ return self.mig186_fake_instances, self.mig186_fake_bdms
107
def _check_186(self, engine, data):
108
block_device = db_utils.get_table(engine, 'block_device_mapping')
109
@@ -1587,6 +1589,24 @@ class TestNovaMigrations(BaseMigrationTe
110
self.assertEqual(bdm_3s[3].image_id, 'fake_image_2')
111
self.assertEqual(bdm_3s[3].boot_index, 0)
113
+ def _post_downgrade_186(self, engine):
114
+ block_device = db_utils.get_table(engine, 'block_device_mapping')
116
+ q = block_device.select().where(
118
+ block_device.c.instance_uuid == 'mig186_uuid-1',
119
+ block_device.c.instance_uuid == 'mig186_uuid-2',
120
+ block_device.c.instance_uuid == 'mig186_uuid-3'))\
121
+ .order_by(block_device.c.device_name.asc())
123
+ expected_bdms = sorted(self.mig186_fake_bdms,
124
+ key=operator.itemgetter('device_name'))
125
+ got_bdms = [bdm for bdm in q.execute()]
127
+ self.assertEquals(len(expected_bdms), len(got_bdms))
128
+ for expected, got in zip(expected_bdms, got_bdms):
129
+ self.assertThat(expected, matchers.IsSubDictOf(dict(got)))
131
# addition of the vm instance groups
132
def _check_no_group_instance_tables(self, engine):
133
self.assertRaises(sqlalchemy.exc.NoSuchTableError,