Merge "Initializing a longer resource id in DB2 nosql backend"

This commit is contained in:
Jenkins 2014-12-04 11:12:07 +00:00 committed by Gerrit Code Review
commit a32d2ef26c
3 changed files with 35 additions and 1 deletions

View File

@ -63,6 +63,11 @@ OPTS = [
help='The name of the replica set which is used to connect to '
'MongoDB database. If it is set, MongoReplicaSetClient '
'will be used instead of MongoClient.'),
cfg.IntOpt('db2nosql_resource_id_maxlen',
default=512,
help="The max length of resources id in DB2 nosql, "
"the value should be larger than len(hostname) * 2 "
"as compute node's resource id is <hostname>_<nodename>."),
]
cfg.CONF.register_opts(OPTS, group='database')

View File

@ -28,6 +28,7 @@ import sys
import bson.code
import bson.objectid
from oslo.config import cfg
from oslo.utils import timeutils
import pymongo
import six
@ -159,7 +160,14 @@ class Connection(pymongo_base.Connection):
# queries, so the database won't take advantage of an index
# including both.
if self.db.resource.index_information() == {}:
resource_id = str(bson.objectid.ObjectId())
# Initializing a longer resource id to workaround DB2 nosql issue.
# Longer resource id is required by compute node's resource as
# their id is '<hostname>_<nodename>'. DB2 creates a VARCHAR(70)
# for resource id when its length < 70. But DB2 can create a
# VARCHAR(n) for the resource id which has n(n>70) characters.
# Users can adjust 'db2nosql_resource_id_maxlen'(default is 512)
# for their ENV.
resource_id = 'x' * cfg.CONF.database.db2nosql_resource_id_maxlen
self.db.resource.insert({'_id': resource_id,
'no_key': resource_id})
meter_id = str(bson.objectid.ObjectId())

View File

@ -26,8 +26,12 @@
from ceilometer.alarm.storage import impl_db2 as impl_db2_alarm
from ceilometer.event.storage import impl_db2 as impl_db2_event
from ceilometer.storage import impl_db2
from ceilometer.storage.mongo import utils as pymongo_utils
from ceilometer.tests import base as test_base
import mock
from oslo.config import cfg
class CapabilitiesTest(test_base.BaseTestCase):
# Check the returned capabilities list, which is specific to each DB
@ -92,3 +96,20 @@ class CapabilitiesTest(test_base.BaseTestCase):
}
actual_capabilities = impl_db2.Connection.get_storage_capabilities()
self.assertEqual(expected_capabilities, actual_capabilities)
class ConnectionTest(test_base.BaseTestCase):
@mock.patch.object(pymongo_utils.ConnectionPool, 'connect')
def test_upgrade(self, mongo_connect):
conn_mock = mock.MagicMock()
conn_mock.server_info.return_value = {}
conn_mock.ceilodb2.resource.index_information.return_value = {}
mongo_connect.return_value = conn_mock
cfg.CONF.set_override('db2nosql_resource_id_maxlen',
256,
group='database')
impl_db2.Connection('db2://user:pwd@localhost:27017/ceilodb2')
resource_id = 'x' * 256
conn_mock.ceilodb2.resource.insert.assert_called_with(
{'_id': resource_id,
'no_key': resource_id})