diff options
author | Julien Danjou <julien@danjou.info> | 2013-03-22 18:00:12 +0100 |
---|---|---|
committer | Julien Danjou <julien@danjou.info> | 2013-03-27 15:13:31 +0100 |
commit | a284960c370113a3a424db97c597560ae6675992 (patch) | |
tree | 083c3a8f1ead0c99b20d5544711cd2de98a7662e | |
parent | 823f2005d895753196490ffccb19c9cec300e431 (diff) | |
download | ceilometer-a284960c370113a3a424db97c597560ae6675992.tar.gz |
Remove impl_test
Change-Id: If939bbaebf35a326076b6263f70248ff13975b45
Signed-off-by: Julien Danjou <julien@danjou.info>
-rw-r--r-- | ceilometer/storage/impl_mongodb.py | 68 | ||||
-rw-r--r-- | ceilometer/storage/impl_test.py | 129 | ||||
-rw-r--r-- | ceilometer/tests/api.py | 2 | ||||
-rw-r--r-- | ceilometer/tests/db.py | 6 | ||||
-rwxr-xr-x | setup.py | 1 | ||||
-rw-r--r-- | tests/api/v1/max_project_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v1/max_resource_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v1/test_impl_mongodb.py | 32 | ||||
-rw-r--r-- | tests/api/v1/test_sum_project_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v1/test_sum_resource_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v2/test_compute_duration_by_resource.py | 4 | ||||
-rw-r--r-- | tests/api/v2/test_max_project_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v2/test_max_resource_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v2/test_sum_project_volume.py | 2 | ||||
-rw-r--r-- | tests/api/v2/test_sum_resource_volume.py | 2 | ||||
-rw-r--r-- | tests/storage/test_impl_mongodb.py | 4 |
16 files changed, 88 insertions, 174 deletions
diff --git a/ceilometer/storage/impl_mongodb.py b/ceilometer/storage/impl_mongodb.py index 77ca0b5d..6a76f34c 100644 --- a/ceilometer/storage/impl_mongodb.py +++ b/ceilometer/storage/impl_mongodb.py @@ -1,8 +1,10 @@ # -*- encoding: utf-8 -*- # # Copyright © 2012 New Dream Network, LLC (DreamHost) +# Copyright © 2013 eNovance # # Author: Doug Hellmann <doug.hellmann@dreamhost.com> +# Julien Danjou <julien@danjou.info> # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -20,7 +22,9 @@ import copy import datetime +import nose import operator +import os import re import urlparse @@ -126,6 +130,8 @@ class Connection(base.Connection): """MongoDB connection. """ + _mim_instance = None + # JavaScript function for doing map-reduce to get a counter volume # total. MAP_COUNTER_VOLUME = bson.code.Code(""" @@ -240,7 +246,36 @@ class Connection(base.Connection): def __init__(self, conf): opts = self._parse_connection_url(conf.database_connection) LOG.info('connecting to MongoDB on %s:%s', opts['host'], opts['port']) - self.conn = self._get_connection(opts) + + if opts['host'] == '__test__': + live_tests = bool(int(os.environ.get('CEILOMETER_TEST_LIVE', 0))) + if live_tests: + url = os.environ.get('CEILOMETER_TEST_MONGO_URL') + if not url: + raise RuntimeError("CEILOMETER_TEST_LIVE is on, but " + "CEILOMETER_TEST_MONGO_URL " + "is not defined") + opts = self._parse_connection_url(url) + self.conn = pymongo.Connection(opts['host'], + opts['port'], + safe=True) + else: + # MIM will die if we have too many connections, so use a + # Singleton + if Connection._mim_instance is None: + try: + from ming import mim + except ImportError: + raise nose.SkipTest("Ming not found") + LOG.debug('Creating a new MIM Connection object') + Connection._mim_instance = mim.Connection() + self.conn = Connection._mim_instance + LOG.debug('Using MIM for test connection') + else: + self.conn = pymongo.Connection(opts['host'], + opts['port'], + safe=True) + self.db = getattr(self.conn, opts['dbname']) if 'username' in opts: self.db.authenticate(opts['username'], opts['password']) @@ -269,17 +304,13 @@ class Connection(base.Connection): pass def clear(self): - self.conn.drop_database(self.db) - - def _get_connection(self, opts): - """Return a connection to the database. - - .. note:: - - The tests use a subclass to override this and return an - in-memory connection. - """ - return pymongo.Connection(opts['host'], opts['port'], safe=True) + if self._mim_instance is not None: + # Don't want to use drop_database() because + # may end up running out of spidermonkey instances. + # http://davisp.lighthouseapp.com/projects/26898/tickets/22 + self.db.clear() + else: + self.conn.drop_database(self.db) def _parse_connection_url(self, url): opts = {} @@ -592,3 +623,16 @@ class Connection(base.Connection): answer = results['results'][0]['value'] return self._fix_interval_min_max(answer['min'], answer['max']) return (None, None) + + +def require_map_reduce(conn): + """Raises SkipTest if the connection is using mim. + """ + # NOTE(dhellmann): mim requires spidermonkey to implement the + # map-reduce functions, so if we can't import it then just + # skip these tests unless we aren't using mim. + try: + import spidermonkey + except BaseException: + if isinstance(conn.conn, mim.Connection): + raise nose.SkipTest('requires spidermonkey') diff --git a/ceilometer/storage/impl_test.py b/ceilometer/storage/impl_test.py deleted file mode 100644 index c6e2d7e8..00000000 --- a/ceilometer/storage/impl_test.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- encoding: utf-8 -*- -# -# Copyright © 2012 New Dream Network, LLC (DreamHost) -# -# Author: Doug Hellmann <doug.hellmann@dreamhost.com> -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -"""In-memory storage driver for use with tests. - -This driver is based on MIM, an in-memory version of MongoDB. -""" - -import os -import nose - -try: - from ming import mim -except ImportError: - mim = None - -from ceilometer.openstack.common import log as logging - -from ceilometer.storage import base -from ceilometer.storage import impl_mongodb - - -LOG = logging.getLogger(__name__) - - -class TestDBStorage(base.StorageEngine): - """Put the data into an in-memory database for testing - - This driver is based on MIM, an in-memory version of MongoDB. - - Collections:: - - - user - - { _id: user id - source: [ array of source ids reporting for the user ] - } - - project - - { _id: project id - source: [ array of source ids reporting for the project ] - } - - meter - - the raw incoming data - - resource - - the metadata for resources - - { _id: uuid of resource, - metadata: metadata dictionaries - timestamp: datetime of last update - user_id: uuid - project_id: uuid - meter: [ array of {counter_name: string, counter_type: string, - counter_unit: string} ] - } - """ - - OPTIONS = [] - - def register_opts(self, conf): - """Register any configuration options used by this engine. - """ - conf.register_opts(self.OPTIONS) - - def get_connection(self, conf): - """Return a Connection instance based on the configuration settings. - """ - return TestConnection(conf) - - -class TestConnection(impl_mongodb.Connection): - - _mim_instance = None - FORCE_MONGO = bool(int(os.environ.get('CEILOMETER_TEST_LIVE', 0))) - - def clear(self): - if TestConnection._mim_instance is not None: - # Don't want to use drop_database() because - # may end up running out of spidermonkey instances. - # http://davisp.lighthouseapp.com/projects/26898/tickets/22 - self.db.clear() - else: - super(TestConnection, self).clear() - - def _get_connection(self, conf): - # Use a real MongoDB server if we can connect, but fall back - # to a Mongo-in-memory connection if we cannot. - if self.FORCE_MONGO: - try: - return super(TestConnection, self)._get_connection(conf) - except: - LOG.debug('Unable to connect to mongodb') - raise - else: - LOG.debug('Using MIM for test connection') - - # MIM will die if we have too many connections, so use a - # Singleton - if TestConnection._mim_instance is None: - if mim: - LOG.debug('Creating a new MIM Connection object') - TestConnection._mim_instance = mim.Connection() - else: - raise nose.SkipTest("Ming not found") - return TestConnection._mim_instance - - -def require_map_reduce(conn): - """Raises SkipTest if the connection is using mim. - """ - # NOTE(dhellmann): mim requires spidermonkey to implement the - # map-reduce functions, so if we can't import it then just - # skip these tests unless we aren't using mim. - try: - import spidermonkey - except BaseException: - if isinstance(conn.conn, mim.Connection): - raise skip.SkipTest('requires spidermonkey') diff --git a/ceilometer/tests/api.py b/ceilometer/tests/api.py index 51a877c4..0fd71187 100644 --- a/ceilometer/tests/api.py +++ b/ceilometer/tests/api.py @@ -30,8 +30,6 @@ import pecan.testing from ceilometer.api import acl from ceilometer.api.v1 import app as v1_app from ceilometer.api.v1 import blueprint as v1_blueprint -from ceilometer import storage -from ceilometer.tests import base from ceilometer.tests import db as db_test_base diff --git a/ceilometer/tests/db.py b/ceilometer/tests/db.py index df1f1396..4151c800 100644 --- a/ceilometer/tests/db.py +++ b/ceilometer/tests/db.py @@ -33,8 +33,10 @@ class BaseException(Exception): class TestBase(test_base.TestCase): - # Default tests use test:// (MIM) - database_connection = 'test://' + # Default tests use mongodb://__test__ (MIM) + # TODO(jd) remove it, so we're sure we run test on the backend we want, + # not this default one by mistake + database_connection = 'mongodb://__test__' def setUp(self): super(TestBase, self).setUp() @@ -130,7 +130,6 @@ setuptools.setup( mysql = ceilometer.storage.impl_sqlalchemy:SQLAlchemyStorage postgresql = ceilometer.storage.impl_sqlalchemy:SQLAlchemyStorage sqlite = ceilometer.storage.impl_sqlalchemy:SQLAlchemyStorage - test = ceilometer.storage.impl_test:TestDBStorage hbase = ceilometer.storage.impl_hbase:HBaseStorage [ceilometer.compute.virt] diff --git a/tests/api/v1/max_project_volume.py b/tests/api/v1/max_project_volume.py index 121513ff..cc2c7a1a 100644 --- a/tests/api/v1/max_project_volume.py +++ b/tests/api/v1/max_project_volume.py @@ -27,7 +27,7 @@ from ceilometer.collector import meter from ceilometer import counter from ceilometer.tests import api as tests_api -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestMaxProjectVolume(tests_api.TestBase): diff --git a/tests/api/v1/max_resource_volume.py b/tests/api/v1/max_resource_volume.py index 85f0d007..ddba1982 100644 --- a/tests/api/v1/max_resource_volume.py +++ b/tests/api/v1/max_resource_volume.py @@ -26,7 +26,7 @@ from ceilometer.collector import meter from ceilometer import counter from ceilometer.tests import api as tests_api -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestMaxResourceVolume(tests_api.TestBase): diff --git a/tests/api/v1/test_impl_mongodb.py b/tests/api/v1/test_impl_mongodb.py index 565a1edb..298105e8 100644 --- a/tests/api/v1/test_impl_mongodb.py +++ b/tests/api/v1/test_impl_mongodb.py @@ -29,64 +29,64 @@ from . import max_resource_volume class TestListEvents(list_events.TestListEvents): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListEventsMetaQuery(list_events.TestListEventsMetaquery): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListEmptyMeters(list_meters.TestListEmptyMeters): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListMeters(list_meters.TestListMeters): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListMetersMetaquery(list_meters.TestListMetersMetaquery): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListEmptyUsers(list_users.TestListEmptyUsers): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListUsers(list_users.TestListUsers): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListEmptyProjects(list_projects.TestListEmptyProjects): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListProjects(list_projects.TestListProjects): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestComputeDurationByResource(cdbr.TestComputeDurationByResource): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListEmptyResources(list_resources.TestListEmptyResources): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListResources(list_resources.TestListResources): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListResourcesMetaquery(list_resources.TestListResourcesMetaquery): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestListSource(list_sources.TestListSource): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestMaxProjectVolume(max_project_volume.TestMaxProjectVolume): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class TestMaxProjectVolume(max_resource_volume.TestMaxResourceVolume): - database_connection = 'test://' + database_connection = 'mongodb://__test__' diff --git a/tests/api/v1/test_sum_project_volume.py b/tests/api/v1/test_sum_project_volume.py index 7ee6e10a..fd043475 100644 --- a/tests/api/v1/test_sum_project_volume.py +++ b/tests/api/v1/test_sum_project_volume.py @@ -27,7 +27,7 @@ from ceilometer.collector import meter from ceilometer import counter from ceilometer.tests import api as tests_api -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestSumProjectVolume(tests_api.TestBase): diff --git a/tests/api/v1/test_sum_resource_volume.py b/tests/api/v1/test_sum_resource_volume.py index 3af09e29..aee4242c 100644 --- a/tests/api/v1/test_sum_resource_volume.py +++ b/tests/api/v1/test_sum_resource_volume.py @@ -27,7 +27,7 @@ from ceilometer.collector import meter from ceilometer import counter from ceilometer.tests import api as tests_api -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestSumResourceVolume(tests_api.TestBase): diff --git a/tests/api/v2/test_compute_duration_by_resource.py b/tests/api/v2/test_compute_duration_by_resource.py index d3d787f3..2cee14d2 100644 --- a/tests/api/v2/test_compute_duration_by_resource.py +++ b/tests/api/v2/test_compute_duration_by_resource.py @@ -22,7 +22,7 @@ import datetime import logging from ceilometer.openstack.common import timeutils -from ceilometer.storage import impl_test +from ceilometer.storage import impl_mongodb from .base import FunctionalTest LOG = logging.getLogger(__name__) @@ -50,7 +50,7 @@ class TestComputeDurationByResource(FunctionalTest): self.late2 = datetime.datetime(2012, 8, 29, 19, 0) def _stub_interval_func(self, func): - self.stubs.Set(impl_test.TestConnection, + self.stubs.Set(impl_mongodb.Connection, 'get_meter_statistics', func) diff --git a/tests/api/v2/test_max_project_volume.py b/tests/api/v2/test_max_project_volume.py index ee0c8320..f7f9d791 100644 --- a/tests/api/v2/test_max_project_volume.py +++ b/tests/api/v2/test_max_project_volume.py @@ -25,7 +25,7 @@ from oslo.config import cfg from ceilometer.collector import meter from ceilometer import counter -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce from .base import FunctionalTest diff --git a/tests/api/v2/test_max_resource_volume.py b/tests/api/v2/test_max_resource_volume.py index a8fd65da..34d327d4 100644 --- a/tests/api/v2/test_max_resource_volume.py +++ b/tests/api/v2/test_max_resource_volume.py @@ -26,7 +26,7 @@ from ceilometer.collector import meter from ceilometer import counter from .base import FunctionalTest -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestMaxResourceVolume(FunctionalTest): diff --git a/tests/api/v2/test_sum_project_volume.py b/tests/api/v2/test_sum_project_volume.py index 92876c6e..9d3fabf5 100644 --- a/tests/api/v2/test_sum_project_volume.py +++ b/tests/api/v2/test_sum_project_volume.py @@ -26,7 +26,7 @@ from ceilometer.collector import meter from ceilometer import counter from .base import FunctionalTest -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestSumProjectVolume(FunctionalTest): diff --git a/tests/api/v2/test_sum_resource_volume.py b/tests/api/v2/test_sum_resource_volume.py index 7d692544..60171b19 100644 --- a/tests/api/v2/test_sum_resource_volume.py +++ b/tests/api/v2/test_sum_resource_volume.py @@ -26,7 +26,7 @@ from ceilometer.collector import meter from ceilometer import counter from .base import FunctionalTest -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class TestSumResourceVolume(FunctionalTest): diff --git a/tests/storage/test_impl_mongodb.py b/tests/storage/test_impl_mongodb.py index 9d3e107c..babf5ced 100644 --- a/tests/storage/test_impl_mongodb.py +++ b/tests/storage/test_impl_mongodb.py @@ -53,11 +53,11 @@ from tests.storage import base from ceilometer.collector import meter from ceilometer import counter -from ceilometer.storage.impl_test import require_map_reduce +from ceilometer.storage.impl_mongodb import require_map_reduce class MongoDBEngineTestBase(base.DBTestBase): - database_connection = 'test://' + database_connection = 'mongodb://__test__' class IndexTest(MongoDBEngineTestBase): |