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:
parent
1ab0ee1258
commit
abf35a436e
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue