enginefacade: 'service'

Use enginefacade in 'service' section.

Implements: blueprint new-oslodb-enginefacade

Co-Authored-By: Sergey Nikitin <snikitin@mirantis.com>

Change-Id: I09281b30b59525cf746f9905cd5a1b5af4c7e846
This commit is contained in:
Pavel Kholkin 2015-12-21 16:50:39 +03:00 committed by Sergey Nikitin
parent 1ab0ee1258
commit abf35a436e
4 changed files with 78 additions and 73 deletions

View File

@ -106,16 +106,14 @@ def service_destroy(context, service_id):
return IMPL.service_destroy(context, service_id)
def service_get(context, service_id, use_slave=False):
def service_get(context, service_id):
"""Get a service or raise if it does not exist."""
return IMPL.service_get(context, service_id,
use_slave=use_slave)
return IMPL.service_get(context, service_id)
def service_get_minimum_version(context, binary, use_slave=False):
def service_get_minimum_version(context, binary):
"""Get the minimum service version in the database."""
return IMPL.service_get_minimum_version(context, binary,
use_slave=use_slave)
return IMPL.service_get_minimum_version(context, binary)
def service_get_by_host_and_topic(context, host, topic):
@ -148,13 +146,12 @@ def service_get_all_by_host(context, host):
return IMPL.service_get_all_by_host(context, host)
def service_get_by_compute_host(context, host, use_slave=False):
def service_get_by_compute_host(context, host):
"""Get the service entry for a given compute host.
Returns the service entry joined with the compute_node entry.
"""
return IMPL.service_get_by_compute_host(context, host,
use_slave=use_slave)
return IMPL.service_get_by_compute_host(context, host)
def service_create(context, values):

View File

@ -425,28 +425,25 @@ class InequalityCondition(object):
###################
@main_context_manager.writer
def service_destroy(context, service_id):
session = get_session()
with session.begin():
service = _service_get(context, service_id)
service = service_get(context, service_id)
model_query(context, models.Service, session=session).\
filter_by(id=service_id).\
soft_delete(synchronize_session=False)
model_query(context, models.Service).\
filter_by(id=service_id).\
soft_delete(synchronize_session=False)
# TODO(sbauza): Remove the service_id filter in a later release
# once we are sure that all compute nodes report the host field
model_query(context, models.ComputeNode, session=session).\
filter(or_(models.ComputeNode.service_id == service_id,
models.ComputeNode.host == service['host'])).\
soft_delete(synchronize_session=False)
# TODO(sbauza): Remove the service_id filter in a later release
# once we are sure that all compute nodes report the host field
model_query(context, models.ComputeNode).\
filter(or_(models.ComputeNode.service_id == service_id,
models.ComputeNode.host == service['host'])).\
soft_delete(synchronize_session=False)
def _service_get(context, service_id, session=None,
use_slave=False):
query = model_query(context, models.Service, session=session,
use_slave=use_slave).\
filter_by(id=service_id)
@main_context_manager.reader
def service_get(context, service_id):
query = model_query(context, models.Service).filter_by(id=service_id)
result = query.first()
if not result:
@ -455,22 +452,17 @@ def _service_get(context, service_id, session=None,
return result
def service_get(context, service_id, use_slave=False):
return _service_get(context, service_id,
use_slave=use_slave)
def service_get_minimum_version(context, binary, use_slave=False):
session = get_session(use_slave=use_slave)
with session.begin():
min_version = session.query(
func.min(models.Service.version)).\
filter(models.Service.binary == binary).\
filter(models.Service.forced_down == false()).\
scalar()
@main_context_manager.reader.allow_async
def service_get_minimum_version(context, binary):
min_version = context.session.query(
func.min(models.Service.version)).\
filter(models.Service.binary == binary).\
filter(models.Service.forced_down == false()).\
scalar()
return min_version
@main_context_manager.reader
def service_get_all(context, disabled=None):
query = model_query(context, models.Service)
@ -480,6 +472,7 @@ def service_get_all(context, disabled=None):
return query.all()
@main_context_manager.reader
def service_get_all_by_topic(context, topic):
return model_query(context, models.Service, read_deleted="no").\
filter_by(disabled=False).\
@ -487,6 +480,7 @@ def service_get_all_by_topic(context, topic):
all()
@main_context_manager.reader
def service_get_by_host_and_topic(context, host, topic):
return model_query(context, models.Service, read_deleted="no").\
filter_by(disabled=False).\
@ -495,6 +489,7 @@ def service_get_by_host_and_topic(context, host, topic):
first()
@main_context_manager.reader
def service_get_all_by_binary(context, binary):
return model_query(context, models.Service, read_deleted="no").\
filter_by(disabled=False).\
@ -502,6 +497,7 @@ def service_get_all_by_binary(context, binary):
all()
@main_context_manager.reader
def service_get_by_host_and_binary(context, host, binary):
result = model_query(context, models.Service, read_deleted="no").\
filter_by(host=host).\
@ -514,15 +510,16 @@ def service_get_by_host_and_binary(context, host, binary):
return result
@main_context_manager.reader
def service_get_all_by_host(context, host):
return model_query(context, models.Service, read_deleted="no").\
filter_by(host=host).\
all()
def service_get_by_compute_host(context, host, use_slave=False):
result = model_query(context, models.Service, read_deleted="no",
use_slave=use_slave).\
@main_context_manager.reader.allow_async
def service_get_by_compute_host(context, host):
result = model_query(context, models.Service, read_deleted="no").\
filter_by(host=host).\
filter_by(binary='nova-compute').\
first()
@ -533,13 +530,14 @@ def service_get_by_compute_host(context, host, use_slave=False):
return result
@main_context_manager.writer
def service_create(context, values):
service_ref = models.Service()
service_ref.update(values)
if not CONF.enable_new_services:
service_ref.disabled = True
try:
service_ref.save()
service_ref.save(context.session)
except db_exc.DBDuplicateEntry as e:
if 'binary' in e.columns:
raise exception.ServiceBinaryExists(host=values.get('host'),
@ -550,17 +548,16 @@ def service_create(context, values):
@oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True)
@main_context_manager.writer
def service_update(context, service_id, values):
session = get_session()
with session.begin():
service_ref = _service_get(context, service_id, session=session)
# Only servicegroup.drivers.db.DbDriver._report_state() updates
# 'report_count', so if that value changes then store the timestamp
# as the last time we got a state report.
if 'report_count' in values:
if values['report_count'] > service_ref.report_count:
service_ref.last_seen_up = timeutils.utcnow()
service_ref.update(values)
service_ref = service_get(context, service_id)
# Only servicegroup.drivers.db.DbDriver._report_state() updates
# 'report_count', so if that value changes then store the timestamp
# as the last time we got a state report.
if 'report_count' in values:
if values['report_count'] > service_ref.report_count:
service_ref.last_seen_up = timeutils.utcnow()
service_ref.update(values)
return service_ref

View File

@ -224,9 +224,15 @@ class Service(base.NovaPersistentObject, base.NovaObject,
return
return cls._from_db_object(context, cls(), db_service)
@staticmethod
@db.select_db_reader_mode
def _db_service_get_by_compute_host(context, host, use_slave=False):
return db.service_get_by_compute_host(context, host)
@base.remotable_classmethod
def get_by_compute_host(cls, context, host, use_slave=False):
db_service = db.service_get_by_compute_host(context, host)
db_service = cls._db_service_get_by_compute_host(context, host,
use_slave=use_slave)
return cls._from_db_object(context, cls(), db_service)
# NOTE(ndipanov): This is deprecated and should be removed on the next
@ -314,6 +320,11 @@ class Service(base.NovaPersistentObject, base.NovaObject,
def clear_min_version_cache(cls):
cls._MIN_VERSION_CACHE = {}
@staticmethod
@db.select_db_reader_mode
def _db_service_get_minimum_version(context, binary, use_slave=False):
return db.service_get_minimum_version(context, binary)
@base.remotable_classmethod
def get_minimum_version(cls, context, binary, use_slave=False):
if not binary.startswith('nova-'):
@ -326,8 +337,8 @@ class Service(base.NovaPersistentObject, base.NovaObject,
cached_version = cls._MIN_VERSION_CACHE.get(binary)
if cached_version:
return cached_version
version = db.service_get_minimum_version(context, binary,
use_slave=use_slave)
version = cls._db_service_get_minimum_version(context, binary,
use_slave=use_slave)
if version is None:
return 0
# NOTE(danms): Since our return value is not controlled by object

View File

@ -18,6 +18,7 @@ from oslo_versionedobjects import base as ovo_base
from oslo_versionedobjects import exception as ovo_exc
from nova.compute import manager as compute_manager
from nova import context
from nova import db
from nova import exception
from nova import objects
@ -271,8 +272,7 @@ class _TestServiceObject(object):
self.assertEqual(0,
objects.Service.get_minimum_version(self.context,
'nova-compute'))
mock_get.assert_called_once_with(self.context, 'nova-compute',
use_slave=False)
mock_get.assert_called_once_with(self.context, 'nova-compute')
@mock.patch('nova.db.service_get_minimum_version')
def test_get_minimum_version(self, mock_get):
@ -280,8 +280,7 @@ class _TestServiceObject(object):
self.assertEqual(123,
objects.Service.get_minimum_version(self.context,
'nova-compute'))
mock_get.assert_called_once_with(self.context, 'nova-compute',
use_slave=False)
mock_get.assert_called_once_with(self.context, 'nova-compute')
@mock.patch('nova.db.service_get_minimum_version')
@mock.patch('nova.objects.service.LOG')
@ -309,8 +308,7 @@ class _TestServiceObject(object):
self.assertEqual(123,
objects.Service.get_minimum_version(self.context,
'nova-compute'))
mock_get.assert_called_once_with(self.context, 'nova-compute',
use_slave=False)
mock_get.assert_called_once_with(self.context, 'nova-compute')
objects.Service._SERVICE_VERSION_CACHING = False
objects.Service.clear_min_version_cache()
@ -349,6 +347,10 @@ class TestRemoteServiceObject(test_objects._RemoteTest,
class TestServiceVersion(test.TestCase):
def setUp(self):
self.ctxt = context.get_admin_context()
super(TestServiceVersion, self).setUp()
def _collect_things(self):
data = {
'compute_rpc': compute_manager.ComputeManager.target.version,
@ -382,12 +384,11 @@ class TestServiceVersion(test.TestCase):
fake_different_service = dict(fake_service)
fake_different_service['version'] = fake_version
obj = objects.Service()
obj._from_db_object(mock.sentinel.context, obj, fake_different_service)
obj._from_db_object(self.ctxt, obj, fake_different_service)
self.assertEqual(fake_version, obj.version)
def test_save_noop_with_only_version(self):
o = objects.Service(context=mock.sentinel.context,
id=fake_service['id'])
o = objects.Service(context=self.ctxt, id=fake_service['id'])
o.obj_reset_changes(['id'])
self.assertEqual(set(['version']), o.obj_what_changed())
with mock.patch('nova.db.service_update') as mock_update:
@ -398,12 +399,15 @@ class TestServiceVersion(test.TestCase):
mock_update.return_value = fake_service
o.save()
mock_update.assert_called_once_with(
mock.sentinel.context, fake_service['id'],
self.ctxt, fake_service['id'],
{'version': service.SERVICE_VERSION,
'host': 'foo'})
class TestServiceStatusNotification(test.TestCase):
def setUp(self):
self.ctxt = context.get_admin_context()
super(TestServiceStatusNotification, self).setUp()
@mock.patch('nova.objects.service.ServiceStatusNotification')
def _verify_notification(self, service_obj, mock_notification):
@ -426,13 +430,11 @@ class TestServiceStatusNotification(test.TestCase):
if field in fake_service:
self.assertEqual(fake_service[field], getattr(payload, field))
mock_notification.return_value.emit.assert_called_once_with(
mock.sentinel.context)
mock_notification.return_value.emit.assert_called_once_with(self.ctxt)
@mock.patch('nova.db.service_update')
def test_service_update_with_notification(self, mock_db_service_update):
service_obj = objects.Service(context=mock.sentinel.context,
id=fake_service['id'])
service_obj = objects.Service(context=self.ctxt, id=fake_service['id'])
mock_db_service_update.return_value = fake_service
for key, value in {'disabled': True,
'disabled_reason': 'my reason',
@ -445,9 +447,7 @@ class TestServiceStatusNotification(test.TestCase):
def test_service_update_without_notification(self,
mock_db_service_update,
mock_notification):
service_obj = objects.Service(context=mock.sentinel.context,
id=fake_service['id'])
service_obj = objects.Service(context=self.ctxt, id=fake_service['id'])
mock_db_service_update.return_value = fake_service
for key, value in {'report_count': 13,