Merge "Restore sqlalchemy unit tests"

This commit is contained in:
Jenkins 2015-09-03 03:05:52 +00:00 committed by Gerrit Code Review
commit bc8a82d3d8
8 changed files with 76 additions and 44 deletions

View File

@ -76,7 +76,7 @@ class CatalogueController(base.CatalogueBase):
self._conn.execute(stmt) self._conn.execute(stmt)
except sa.exc.IntegrityError: except sa.exc.IntegrityError:
self.update(project, queue, pool) self._update(project, queue, pool)
def delete(self, project, queue): def delete(self, project, queue):
stmt = sa.sql.delete(tables.Catalogue).where( stmt = sa.sql.delete(tables.Catalogue).where(
@ -84,6 +84,12 @@ class CatalogueController(base.CatalogueBase):
) )
self._conn.execute(stmt) self._conn.execute(stmt)
def _update(self, project, queue, pool):
stmt = sa.sql.update(tables.Catalogue).where(
_match(project, queue)
).values(pool=pool)
self._conn.execute(stmt)
def update(self, project, queue, pool=None): def update(self, project, queue, pool=None):
if pool is None: if pool is None:
return return
@ -91,10 +97,7 @@ class CatalogueController(base.CatalogueBase):
if not self.exists(project, queue): if not self.exists(project, queue):
raise errors.QueueNotMapped(queue, project) raise errors.QueueNotMapped(queue, project)
stmt = sa.sql.update(tables.Catalogue).where( self._update(project, queue, pool)
_match(project, queue)
).values(pool=pool)
self._conn.execute(stmt)
def drop_all(self): def drop_all(self):
stmt = sa.sql.expression.delete(tables.Catalogue) stmt = sa.sql.expression.delete(tables.Catalogue)

View File

@ -86,11 +86,22 @@ class PoolsController(base.PoolsBase):
return _normalize(pool, detailed) return _normalize(pool, detailed)
def _ensure_group_exists(self, name):
try:
stmt = sa.sql.expression.insert(tables.PoolGroup).values(name=name)
self._conn.execute(stmt)
return True
except sa.exc.IntegrityError:
return False
# TODO(cpp-cabrera): rename to upsert # TODO(cpp-cabrera): rename to upsert
@utils.raises_conn_error @utils.raises_conn_error
def _create(self, name, weight, uri, group=None, options=None): def _create(self, name, weight, uri, group=None, options=None):
opts = None if options is None else utils.json_encode(options) opts = None if options is None else utils.json_encode(options)
if group is not None:
self._ensure_group_exists(group)
try: try:
stmt = sa.sql.expression.insert(tables.Pools).values( stmt = sa.sql.expression.insert(tables.Pools).values(
name=name, weight=weight, uri=uri, group=group, options=opts name=name, weight=weight, uri=uri, group=group, options=opts
@ -143,6 +154,8 @@ class PoolsController(base.PoolsBase):
def _drop_all(self): def _drop_all(self):
stmt = sa.sql.expression.delete(tables.Pools) stmt = sa.sql.expression.delete(tables.Pools)
self._conn.execute(stmt) self._conn.execute(stmt)
stmt = sa.sql.expression.delete(tables.PoolGroup)
self._conn.execute(stmt)
def _normalize(pool, detailed=False): def _normalize(pool, detailed=False):

View File

@ -58,15 +58,17 @@ class QueueController(storage.Queue):
if project is None: if project is None:
project = '' project = ''
try: sel = sa.sql.select([tables.Queues.c.metadata], sa.and_(
sel = sa.sql.select([tables.Queues.c.metadata], sa.and_( tables.Queues.c.project == project,
tables.Queues.c.project == project, tables.Queues.c.name == name
tables.Queues.c.name == name ))
))
return utils.json_decode(self.driver.run(sel).fetchone()[0]) queue = self.driver.run(sel).fetchone()
except utils.NoResult: if queue is None:
raise errors.QueueDoesNotExist(name, project) raise errors.QueueDoesNotExist(name, project)
return utils.json_decode(queue[0])
def _get(self, name, project=None): def _get(self, name, project=None):
try: try:
return self.get_metadata(name, project) return self.get_metadata(name, project)

View File

@ -28,19 +28,25 @@ Queues = sa.Table('Queues', metadata,
) )
PoolGroup = sa.Table('PoolGroup', metadata,
sa.Column('name', sa.String(64), primary_key=True))
Pools = sa.Table('Pools', metadata, Pools = sa.Table('Pools', metadata,
sa.Column('name', sa.String(64), primary_key=True), sa.Column('name', sa.String(64), primary_key=True),
sa.Column('group', sa.String(64), sa.Column('group', sa.ForeignKey('PoolGroup.name',
unique=True, nullable=True), ondelete='CASCADE'),
nullable=True),
sa.Column('uri', sa.String(255), sa.Column('uri', sa.String(255),
unique=True, nullable=False), unique=True, nullable=False),
sa.Column('weight', sa.INTEGER, nullable=False), sa.Column('weight', sa.INTEGER, nullable=False),
sa.Column('options', sa.BINARY)) sa.Column('options', sa.BINARY))
Flavors = sa.Table('Flavors', metadata, Flavors = sa.Table('Flavors', metadata,
sa.Column('name', sa.String(64), primary_key=True), sa.Column('name', sa.String(64), primary_key=True),
sa.Column('project', sa.String(64)), sa.Column('project', sa.String(64)),
sa.Column('pool', sa.ForeignKey('Pools.group', sa.Column('pool', sa.ForeignKey('PoolGroup.name',
ondelete='CASCADE'), ondelete='CASCADE'),
nullable=False), nullable=False),
sa.Column('capabilities', sa.BINARY)) sa.Column('capabilities', sa.BINARY))

View File

@ -5,7 +5,8 @@ admin_mode = False
[drivers] [drivers]
transport = wsgi transport = wsgi
message_store = sqlalchemy message_store = mongodb
management_store = sqlalchemy
[drivers:transport:wsgi] [drivers:transport:wsgi]
bind = 0.0.0.0 bind = 0.0.0.0

View File

@ -173,7 +173,7 @@ def pool_entry(controller, project, queue, pool):
@contextlib.contextmanager @contextlib.contextmanager
def pool_entries(controller, count): def pool_entries(controller, pool_ctrl, count):
"""Context manager to create several catalogue entries for testing. """Context manager to create several catalogue entries for testing.
The entries are automatically deleted when the context manager The entries are automatically deleted when the context manager
@ -190,12 +190,14 @@ def pool_entries(controller, count):
for i in range(count)] for i in range(count)]
for p, q, s in spec: for p, q, s in spec:
pool_ctrl.create(s, 100, s)
controller.insert(p, q, s) controller.insert(p, q, s)
yield spec yield spec
for p, q, _ in spec: for p, q, s in spec:
controller.delete(p, q) controller.delete(p, q)
pool_ctrl.delete(s)
def requires_mongodb(test_case): def requires_mongodb(test_case):

View File

@ -1258,8 +1258,15 @@ class CatalogueControllerTest(ControllerBaseTest):
def setUp(self): def setUp(self):
super(CatalogueControllerTest, self).setUp() super(CatalogueControllerTest, self).setUp()
self.controller = self.driver.catalogue_controller self.controller = self.driver.catalogue_controller
self.queue = six.text_type(uuid.uuid1()) self.pool_ctrl = self.driver.pools_controller
self.project = six.text_type(uuid.uuid1()) self.queue = six.text_type(uuid.uuid4())
self.project = six.text_type(uuid.uuid4())
self.pool = str(uuid.uuid1())
self.pool_group = str(uuid.uuid1())
self.pool_ctrl.create(self.pool, 100, 'localhost',
group=self.pool_group, options={})
self.addCleanup(self.pool_ctrl.delete, self.pool)
def tearDown(self): def tearDown(self):
self.controller.drop_all() self.controller.drop_all()
@ -1287,13 +1294,14 @@ class CatalogueControllerTest(ControllerBaseTest):
self.fail('There should be no entries at this time') self.fail('There should be no entries at this time')
# create a listing, check its length # create a listing, check its length
with helpers.pool_entries(self.controller, 10) as expect: with helpers.pool_entries(self.controller,
self.pool_ctrl, 10) as expect:
project = expect[0][0] project = expect[0][0]
xs = list(self.controller.list(project)) xs = list(self.controller.list(project))
self.assertEqual(len(xs), 10) self.assertEqual(len(xs), 10)
# create, check existence, delete # create, check existence, delete
with helpers.pool_entry(self.controller, project, queue, u'a'): with helpers.pool_entry(self.controller, project, queue, self.pool):
self.assertTrue(self.controller.exists(project, queue)) self.assertTrue(self.controller.exists(project, queue))
# verify it no longer exists # verify it no longer exists
@ -1303,7 +1311,8 @@ class CatalogueControllerTest(ControllerBaseTest):
self.assertEqual(len(list(self.controller.list(project))), 0) self.assertEqual(len(list(self.controller.list(project))), 0)
def test_list(self): def test_list(self):
with helpers.pool_entries(self.controller, 10) as expect: with helpers.pool_entries(self.controller,
self.pool_ctrl, 10) as expect:
values = zip(self.controller.list(u'_'), expect) values = zip(self.controller.list(u'_'), expect)
for e, x in values: for e, x in values:
p, q, s = x p, q, s = x
@ -1311,12 +1320,18 @@ class CatalogueControllerTest(ControllerBaseTest):
self._check_value(e, xqueue=q, xproject=p, xpool=s) self._check_value(e, xqueue=q, xproject=p, xpool=s)
def test_update(self): def test_update(self):
p2 = u'b'
self.pool_ctrl.create(p2, 100, '127.0.0.1',
group=self.pool_group,
options={})
self.addCleanup(self.pool_ctrl.delete, p2)
with helpers.pool_entry(self.controller, self.project, with helpers.pool_entry(self.controller, self.project,
self.queue, u'a') as expect: self.queue, self.pool) as expect:
p, q, s = expect p, q, s = expect
self.controller.update(p, q, pool=u'b') self.controller.update(p, q, pool=p2)
entry = self.controller.get(p, q) entry = self.controller.get(p, q)
self._check_value(entry, xqueue=q, xproject=p, xpool=u'b') self._check_value(entry, xqueue=q, xproject=p, xpool=p2)
def test_update_raises_when_entry_does_not_exist(self): def test_update_raises_when_entry_does_not_exist(self):
e = self.assertRaises(errors.QueueNotMapped, e = self.assertRaises(errors.QueueNotMapped,
@ -1327,7 +1342,7 @@ class CatalogueControllerTest(ControllerBaseTest):
def test_get(self): def test_get(self):
with helpers.pool_entry(self.controller, with helpers.pool_entry(self.controller,
self.project, self.project,
self.queue, u'a') as expect: self.queue, self.pool) as expect:
p, q, s = expect p, q, s = expect
e = self.controller.get(p, q) e = self.controller.get(p, q)
self._check_value(e, xqueue=q, xproject=p, xpool=s) self._check_value(e, xqueue=q, xproject=p, xpool=s)
@ -1350,7 +1365,7 @@ class CatalogueControllerTest(ControllerBaseTest):
def test_exists(self): def test_exists(self):
with helpers.pool_entry(self.controller, with helpers.pool_entry(self.controller,
self.project, self.project,
self.queue, u'a') as expect: self.queue, self.pool) as expect:
p, q, _ = expect p, q, _ = expect
self.assertTrue(self.controller.exists(p, q)) self.assertTrue(self.controller.exists(p, q))
self.assertFalse(self.controller.exists('nada', 'not_here')) self.assertFalse(self.controller.exists('nada', 'not_here'))

View File

@ -21,35 +21,25 @@ from zaqar import tests as testing
from zaqar.tests.unit.storage import base from zaqar.tests.unit.storage import base
# NOTE(flaper87): We'll need this after splitting queues
# from the data driver
class SqlalchemyQueueTests(base.QueueControllerTest): class SqlalchemyQueueTests(base.QueueControllerTest):
driver_class = sqlalchemy.ControlDriver driver_class = sqlalchemy.ControlDriver
config_file = 'wsgi_sqlalchemy.conf'
controller_class = controllers.QueueController controller_class = controllers.QueueController
control_driver_class = sqlalchemy.ControlDriver
class SqlalchemyPoolsTest(base.PoolsControllerTest): class SqlalchemyPoolsTest(base.PoolsControllerTest):
config_file = 'wsgi_sqlalchemy.conf'
driver_class = sqlalchemy.ControlDriver driver_class = sqlalchemy.ControlDriver
controller_class = controllers.PoolsController controller_class = controllers.PoolsController
control_driver_class = sqlalchemy.ControlDriver
def setUp(self):
super(SqlalchemyPoolsTest, self).setUp()
self.load_conf('wsgi_sqlalchemy.conf')
def tearDown(self):
super(SqlalchemyPoolsTest, self).tearDown()
class SqlalchemyCatalogueTest(base.CatalogueControllerTest): class SqlalchemyCatalogueTest(base.CatalogueControllerTest):
config_file = 'wsgi_sqlalchemy.conf'
driver_class = sqlalchemy.ControlDriver driver_class = sqlalchemy.ControlDriver
controller_class = controllers.CatalogueController controller_class = controllers.CatalogueController
control_driver_class = sqlalchemy.ControlDriver
def setUp(self):
super(SqlalchemyCatalogueTest, self).setUp()
self.load_conf('wsgi_sqlalchemy.conf')
def tearDown(self):
super(SqlalchemyCatalogueTest, self).tearDown()
class MsgidTests(testing.TestBase): class MsgidTests(testing.TestBase):