Remove context passing around, use climate.context instead

Since we have a global context storage we should use it everywhere. I
suggest we remove all this ctx args and never bring them back.
In case someone wants to run something with different context one can
always do:

    with my_other_context:
        run_method_without_ctx_in_args()

Change-Id: I976726f59cedd79f1d619f35f570c60e2c701c7d
This commit is contained in:
Yuriy Taraday 2013-10-28 15:12:11 +04:00
parent bcf2cc9395
commit dfbaa5a410
4 changed files with 130 additions and 126 deletions

View File

@ -106,118 +106,118 @@ def to_dict(func):
#Reservation
def reservation_create(ctx, reservation_values):
def reservation_create(reservation_values):
"""Create a reservation from the values."""
return IMPL.reservation_create(ctx, reservation_values)
return IMPL.reservation_create(reservation_values)
@to_dict
def reservation_get_all_by_lease(ctx, lease_id):
def reservation_get_all_by_lease(lease_id):
"""Return all reservations belongs to specific lease."""
return IMPL.reservation_get_all_by_lease(ctx, lease_id)
return IMPL.reservation_get_all_by_lease(lease_id)
@to_dict
def reservation_get(ctx, reservation_id):
def reservation_get(reservation_id):
"""Return specific reservation."""
return IMPL.reservation_get(ctx, reservation_id)
return IMPL.reservation_get(reservation_id)
def reservation_destroy(ctx, reservation_id):
def reservation_destroy(reservation_id):
"""Delete specific reservation."""
IMPL.reservation_destroy(ctx, reservation_id)
IMPL.reservation_destroy(reservation_id)
def reservation_update(ctx, reservation_id, reservation_values):
def reservation_update(reservation_id, reservation_values):
"""Update reservation."""
IMPL.reservation_update(ctx, reservation_id, reservation_values)
IMPL.reservation_update(reservation_id, reservation_values)
#Lease
def lease_create(ctx, lease_values):
def lease_create(lease_values):
"""Create a lease from values."""
return IMPL.lease_create(ctx, lease_values)
return IMPL.lease_create(lease_values)
@to_dict
def lease_get_all(ctx):
def lease_get_all():
"""Return all leases."""
return IMPL.lease_get_all(ctx)
return IMPL.lease_get_all()
@to_dict
def lease_get_all_by_tenant(ctx, tenant_id):
def lease_get_all_by_tenant(tenant_id):
"""Return all leases in specific tenant."""
return IMPL.lease_get_all_by_tenant(ctx, tenant_id)
return IMPL.lease_get_all_by_tenant(tenant_id)
@to_dict
def lease_get_all_by_user(ctx, user_id):
def lease_get_all_by_user(user_id):
"""Return all leases belongs to specific user."""
return IMPL.lease_get_all_by_user(ctx, user_id)
return IMPL.lease_get_all_by_user(user_id)
@to_dict
def lease_get(ctx, lease_id):
def lease_get(lease_id):
"""Return lease."""
return IMPL.lease_get(ctx, lease_id)
return IMPL.lease_get(lease_id)
@to_dict
def lease_list(ctx):
def lease_list():
"""Return a list of all existing leases."""
return IMPL.lease_list(ctx)
return IMPL.lease_list()
def lease_destroy(ctx, lease_id):
def lease_destroy(lease_id):
"""Delete lease or raise if not exists."""
IMPL.lease_destroy(ctx, lease_id)
IMPL.lease_destroy(lease_id)
def lease_update(ctx, lease_id, lease_values):
def lease_update(lease_id, lease_values):
"""Update lease or raise if not exists."""
IMPL.lease_update(ctx, lease_id, lease_values)
IMPL.lease_update(lease_id, lease_values)
#Events
@to_dict
def event_create(ctx, event_values):
def event_create(event_values):
"""Create an event from values."""
return IMPL.event_create(ctx, event_values)
return IMPL.event_create(event_values)
@to_dict
def event_get_all(ctx):
def event_get_all():
"""Return all events."""
return IMPL.event_get_all(ctx)
return IMPL.event_get_all()
@to_dict
def event_get(ctx, event_id):
def event_get(event_id):
"""Return a specific event."""
return IMPL.event_get(ctx, event_id)
return IMPL.event_get(event_id)
@to_dict
def event_get_all_sorted_by_filters(ctx, sort_key, sort_dir, filters):
def event_get_all_sorted_by_filters(sort_key, sort_dir, filters):
"""Return instances sorted by param."""
return IMPL.event_get_all_sorted_by_filters(ctx, sort_key, sort_dir,
return IMPL.event_get_all_sorted_by_filters(sort_key, sort_dir,
filters)
@to_dict
def event_list(ctx, param):
def event_list(param):
"""Return a list of events."""
return IMPL.event_list(ctx)
return IMPL.event_list()
def event_destroy(ctx, event_id):
def event_destroy(event_id):
"""Delete event or raise if not exists."""
IMPL.event_destroy(ctx, event_id)
IMPL.event_destroy(event_id)
def event_update(ctx, event_id, event_values):
def event_update(event_id, event_values):
"""Update event or raise if not exists."""
IMPL.event_update(ctx, event_id, event_values)
IMPL.event_update(event_id, event_values)

View File

@ -21,6 +21,7 @@ import sqlalchemy as sa
from sqlalchemy.sql.expression import asc
from sqlalchemy.sql.expression import desc
from climate import context
from climate.db.sqlalchemy import models
from climate.openstack.common.db import exception as db_exc
from climate.openstack.common.db.sqlalchemy import session as db_session
@ -38,30 +39,31 @@ def get_backend():
return sys.modules[__name__]
def model_query(model, ctx, session=None, project_only=None):
def model_query(model, session=None, project_only=None):
"""Query helper.
:param model: base model to query
:param ctx: ctx to query under
:param project_only: if present and ctx is user-type, then restrict
query to match the ctx's project_id.
:param project_only: if present and current context is user-type,
then restrict query to match the project_id from current context.
"""
session = session or get_session()
query = session.query(model)
if project_only:
ctx = context.Context.current()
query = query.filter_by(tenant_id=ctx.project_id)
return query
def column_query(ctx, *columns, **kwargs):
def column_query(*columns, **kwargs):
session = kwargs.get("session") or get_session()
query = session.query(*columns)
if kwargs.get("project_only"):
ctx = context.Context.current()
query = query.filter_by(tenant_id=ctx.tenant_id)
return query
@ -130,28 +132,28 @@ class InequalityCondition(object):
#Reservation
def _reservation_get(ctx, session, reservation_id):
query = model_query(models.Reservation, ctx, session)
def _reservation_get(session, reservation_id):
query = model_query(models.Reservation, session)
return query.filter_by(id=reservation_id).first()
def reservation_get(ctx, reservation_id):
return _reservation_get(ctx, get_session(), reservation_id)
def reservation_get(reservation_id):
return _reservation_get(get_session(), reservation_id)
def reservation_get_all(ctx):
query = model_query(models.Reservation, ctx, get_session())
def reservation_get_all():
query = model_query(models.Reservation, get_session())
return query.all()
def reservation_get_all_by_lease_id(ctx, lease_id):
reservations = model_query(models.Reservation, ctx, get_session()).\
def reservation_get_all_by_lease_id(lease_id):
reservations = model_query(models.Reservation, get_session()).\
filter_by(lease_id=lease_id)
return reservations.all()
def reservation_create(ctx, values):
def reservation_create(values):
values = values.copy()
reservation = models.Reservation()
reservation.update(values)
@ -164,24 +166,24 @@ def reservation_create(ctx, values):
# raise exception about duplicated columns (e.columns)
raise RuntimeError("DBDuplicateEntry: %s" % e.columns)
return reservation_get(ctx, reservation.id)
return reservation_get(reservation.id)
def reservation_update(ctx, reservation_id, values):
def reservation_update(reservation_id, values):
session = get_session()
with session.begin():
reservation = _reservation_get(ctx, session, reservation_id)
reservation = _reservation_get(session, reservation_id)
reservation.update(values)
reservation.save(session=session)
return reservation_get(ctx, reservation_id)
return reservation_get(reservation_id)
def reservation_destroy(ctx, reservation_id):
def reservation_destroy(reservation_id):
session = get_session()
with session.begin():
reservation = _reservation_get(ctx, session, reservation_id)
reservation = _reservation_get(session, reservation_id)
if not reservation:
# raise not found error
@ -191,33 +193,33 @@ def reservation_destroy(ctx, reservation_id):
#Lease
def _lease_get(ctx, session, lease_id):
query = model_query(models.Lease, ctx, session)
def _lease_get(session, lease_id):
query = model_query(models.Lease, session)
return query.filter_by(id=lease_id).first()
def lease_get(ctx, lease_id):
return _lease_get(ctx, get_session(), lease_id)
def lease_get(lease_id):
return _lease_get(get_session(), lease_id)
def lease_get_all(ctx):
query = model_query(models.Lease, ctx, get_session())
def lease_get_all():
query = model_query(models.Lease, get_session())
return query.all()
def lease_get_all_by_tenant(ctx, tenant_id):
def lease_get_all_by_tenant(tenant_id):
raise NotImplementedError
def lease_get_all_by_user(ctx, user_id):
def lease_get_all_by_user(user_id):
raise NotImplementedError
def lease_list(ctx):
return model_query(models.Lease, ctx, get_session()).all()
def lease_list():
return model_query(models.Lease, get_session()).all()
def lease_create(ctx, values):
def lease_create(values):
values = values.copy()
lease = models.Lease()
reservations = values.pop("reservations", [])
@ -245,24 +247,24 @@ def lease_create(ctx, values):
# raise exception about duplicated columns (e.columns)
raise RuntimeError("DBDuplicateEntry: %s" % e.columns)
return lease_get(ctx, lease.id)
return lease_get(lease.id)
def lease_update(ctx, lease_id, values):
def lease_update(lease_id, values):
session = get_session()
with session.begin():
lease = _lease_get(ctx, session, lease_id)
lease = _lease_get(session, lease_id)
lease.update(values)
lease.save(session=session)
return lease_get(ctx, lease_id)
return lease_get(lease_id)
def lease_destroy(ctx, lease_id):
def lease_destroy(lease_id):
session = get_session()
with session.begin():
lease = _lease_get(ctx, session, lease_id)
lease = _lease_get(session, lease_id)
if not lease:
# raise not found error
@ -272,30 +274,30 @@ def lease_destroy(ctx, lease_id):
#Event
def _event_get(ctx, session, event_id):
query = model_query(models.Event, ctx, session)
def _event_get(session, event_id):
query = model_query(models.Event, session)
return query.filter_by(id=event_id).first()
def _event_get_all(ctx, session):
query = model_query(models.Event, ctx, session)
def _event_get_all(session):
query = model_query(models.Event, session)
return query
def event_get(ctx, event_id):
return _event_get(ctx, get_session(), event_id)
def event_get(event_id):
return _event_get(get_session(), event_id)
def event_get_all(ctx):
return _event_get_all(ctx, get_session()).all()
def event_get_all():
return _event_get_all(get_session()).all()
def event_get_all_sorted_by_filters(ctx, sort_key, sort_dir, filters):
def event_get_all_sorted_by_filters(sort_key, sort_dir, filters):
"""Return events filtered and sorted by name of the field."""
sort_fn = {'desc': desc, 'asc': asc}
events_query = _event_get_all(ctx, get_session())
events_query = _event_get_all(get_session())
if 'status' in filters:
events_query = \
@ -308,11 +310,11 @@ def event_get_all_sorted_by_filters(ctx, sort_key, sort_dir, filters):
return events_query.all()
def event_list(ctx):
return model_query(models.Event.id, ctx, get_session()).all()
def event_list():
return model_query(models.Event.id, get_session()).all()
def event_create(ctx, values):
def event_create(values):
values = values.copy()
event = models.Event()
event.update(values)
@ -325,24 +327,24 @@ def event_create(ctx, values):
# raise exception about duplicated columns (e.columns)
raise RuntimeError("DBDuplicateEntry: %s" % e.columns)
return event_get(ctx, event.id)
return event_get(event.id)
def event_update(ctx, event_id, values):
def event_update(event_id, values):
session = get_session()
with session.begin():
event = _event_get(ctx, session, event_id)
event = _event_get(session, event_id)
event.update(values)
event.save(session=session)
return event_get(ctx, event_id)
return event_get(event_id)
def event_destroy(ctx, event_id):
def event_destroy(event_id):
session = get_session()
with session.begin():
event = _event_get(ctx, session, event_id)
event = _event_get(session, event_id)
if not event:
# raise not found error

View File

@ -18,6 +18,7 @@ import tempfile
import fixtures
from oslo.config import cfg
from climate import context
from climate.db.sqlalchemy import api as db_api
from climate.openstack.common.db.sqlalchemy import session as db_session
from climate.openstack.common.fixture import config
@ -62,12 +63,18 @@ class TestCase(test.BaseTestCase):
super(TestCase, self).setUp()
self.useFixture(config.Config())
cfg.CONF([], project='climate')
self.context_mock = None
def patch(self, obj, attr):
"""Returns a Mocked object on the patched attribute."""
mockfixture = self.useFixture(mockpatch.PatchObject(obj, attr))
return mockfixture.mock
def set_context(self, ctx):
if self.context_mock is None:
self.context_mock = self.patch(context.Context, 'current')
self.context_mock.return_value = ctx
class DBTestCase(TestCase):
"""Test case base class for all database unit tests.

View File

@ -77,21 +77,19 @@ def _get_fake_phys_lease_values(id=_get_fake_lease_uuid(),
}
def _create_virtual_lease(context=context.get_admin_context(),
values=_get_fake_virt_lease_values(),
def _create_virtual_lease(values=_get_fake_virt_lease_values(),
random=False):
"""Creating fake lease having a single virtual resource."""
return db_api.lease_create(context, values)
return db_api.lease_create(values)
def _create_physical_lease(context=context.get_admin_context(),
values=_get_fake_phys_lease_values(),
def _create_physical_lease(values=_get_fake_phys_lease_values(),
random=False):
"""Creating fake lease having a single physical resource."""
if random is True:
values = _get_fake_phys_lease_values(id=_get_fake_random_uuid(),
name=_get_fake_random_uuid())
return db_api.lease_create(context, values)
return db_api.lease_create(values)
class SQLAlchemyDBApiTestCase(test.DBTestCase):
@ -99,71 +97,68 @@ class SQLAlchemyDBApiTestCase(test.DBTestCase):
def setUp(self):
super(SQLAlchemyDBApiTestCase, self).setUp()
self.context = context.get_admin_context()
self.set_context(context.get_admin_context())
def test_create_virt_lease(self):
"""Create a virtual lease and verify that all tables have been
populated.
"""
result = db_api.lease_create(self.context,
_get_fake_virt_lease_values())
result = db_api.lease_create(_get_fake_virt_lease_values())
self.assertEquals(result['name'],
_get_fake_virt_lease_values()['name'])
self.assertEqual(0, len(db_api.event_get_all(self.context)))
self.assertEqual(1, len(db_api.reservation_get_all(self.context)))
self.assertEqual(0, len(db_api.event_get_all()))
self.assertEqual(1, len(db_api.reservation_get_all()))
def test_create_phys_lease(self):
"""Create a physical lease and verify that all tables have been
populated.
"""
result = db_api.lease_create(self.context,
_get_fake_phys_lease_values())
result = db_api.lease_create(_get_fake_phys_lease_values())
self.assertEquals(result['name'],
_get_fake_phys_lease_values()['name'])
self.assertEqual(0, len(db_api.event_get_all(self.context)))
self.assertEqual(1, len(db_api.reservation_get_all(self.context)))
self.assertEqual(0, len(db_api.event_get_all()))
self.assertEqual(1, len(db_api.reservation_get_all()))
def test_create_duplicate_leases(self):
"""Create two leases with same names, and checks it raises an error.
"""
db_api.lease_create(self.context, _get_fake_phys_lease_values())
db_api.lease_create(_get_fake_phys_lease_values())
self.assertRaises(RuntimeError, db_api.lease_create,
self.context, _get_fake_phys_lease_values())
_get_fake_phys_lease_values())
def test_create_lease_with_event(self):
"""Create a lease including a fake event and check all tables."""
lease = _get_fake_phys_lease_values()
lease['events'].append(_get_fake_event_values(lease_id=lease['id']))
result = db_api.lease_create(self.context, lease)
result = db_api.lease_create(lease)
self.assertEquals(result['name'],
_get_fake_phys_lease_values()['name'])
self.assertEqual(1, len(db_api.event_get_all(self.context)))
self.assertEqual(1, len(db_api.event_get_all()))
def test_delete_wrong_lease(self):
"""Delete a lease that doesn't exist and check that raises an error."""
self.assertRaises(RuntimeError,
db_api.lease_destroy, self.context, 'fake_id')
self.assertRaises(RuntimeError, db_api.lease_destroy, 'fake_id')
def test_delete_correct_lease(self):
"""Delete a lease and check that deletion has been cascaded to FKs."""
lease = _get_fake_phys_lease_values()
lease['events'].append(_get_fake_event_values(lease_id=lease['id']))
result = _create_physical_lease(values=lease)
db_api.lease_destroy(self.context, result['id'])
self.assertIsNone(db_api.lease_get(self.context, result['id']))
self.assertEqual(0, len(db_api.reservation_get_all(self.context)))
self.assertEqual(0, len(db_api.event_get_all(self.context)))
db_api.lease_destroy(result['id'])
self.assertIsNone(db_api.lease_get(result['id']))
self.assertEqual(0, len(db_api.reservation_get_all()))
self.assertEqual(0, len(db_api.event_get_all()))
def test_lease_get_all(self):
"""Check the number of leases we get."""
_create_physical_lease(random=True)
self.assertEqual(1, len(db_api.lease_get_all(self.context)))
self.assertEqual(1, len(db_api.lease_get_all()))
_create_physical_lease(random=True)
self.assertEqual(2, len(db_api.lease_get_all(self.context)))
self.assertEqual(2, len(db_api.lease_get_all()))
def test_lease_list(self):
"""Not implemented yet until lease_list returns list of IDs."""
@ -174,16 +169,16 @@ class SQLAlchemyDBApiTestCase(test.DBTestCase):
values=_get_fake_phys_lease_values(id='1', name='fake1'))
_create_physical_lease(
values=_get_fake_phys_lease_values(id='2', name='fake2'))
self.assertEquals(['1', '2'], db_api.lease_list(self.context))
self.assertEquals(['1', '2'], db_api.lease_list())
def test_lease_update(self):
"""Update both start_time and name and check lease has been updated."""
result = _create_physical_lease()
result = db_api.lease_update(self.context, result['id'],
result = db_api.lease_update(result['id'],
values={'name': 'lease_renamed'})
self.assertEquals('lease_renamed', result['name'])
result = db_api.lease_update(
self.context, result['id'],
result['id'],
values={'start_date': _get_datetime('2014-02-01 00:00')})
self.assertEquals(_get_datetime('2014-02-01 00:00'),
result['start_date'])