Refactored storage tests to use testscenarios
This refactore storage tests to use testscenarios The test_impl_* files now have only test related the a particular backend. All common tests are in test_impl_scenarios.py (previously named base.py) The maxconns of Mongod have been increase to allow db2 to run Parts of blueprint db-tests-with-scenarios Change-Id: I94955ca1cead3f7c7e04b57b9ce1313324e4a349
This commit is contained in:
parent
178e8f7cea
commit
056e883373
@ -490,6 +490,15 @@ class Connection(base.Connection):
|
||||
The filter must have a meter value set.
|
||||
|
||||
"""
|
||||
#FIXME(sileht): since testscenarios is used
|
||||
# all API functionnal and DB tests have been enabled
|
||||
# get_meter_statistics will not return the expected data in some tests
|
||||
# Some other tests return "IndexError: list index out of range"
|
||||
# on the line: rslt = results['result'][0]
|
||||
# complete trace: http://paste.openstack.org/show/45016/
|
||||
# And because I have no db2 installation to test,
|
||||
# I have disable this method until it is fixed
|
||||
raise NotImplementedError("Statistics not implemented")
|
||||
|
||||
if groupby:
|
||||
raise NotImplementedError("Group by not implemented.")
|
||||
|
@ -64,6 +64,20 @@ class MongoDBFakeConnectionUrl(object):
|
||||
return '%(url)s_%(db)s' % dict(url=self.url, db=uuid.uuid4().hex)
|
||||
|
||||
|
||||
class DB2FakeConnectionUrl(MongoDBFakeConnectionUrl):
|
||||
def __init__(self):
|
||||
self.url = (os.environ.get('CEILOMETER_TEST_DB2_URL') or
|
||||
os.environ.get('CEILOMETER_TEST_MONGODB_URL'))
|
||||
if not self.url:
|
||||
raise RuntimeError(
|
||||
"No DB2 test URL set, "
|
||||
"export CEILOMETER_TEST_DB2_URL environment variable")
|
||||
else:
|
||||
# This is to make sure that the db2 driver is used when
|
||||
# CEILOMETER_TEST_DB2_URL was not set
|
||||
self.url = self.url.replace('mongodb:', 'db2:', 1)
|
||||
|
||||
|
||||
class MixinTestsWithBackendScenarios(object):
|
||||
__metaclass__ = test_base.SkipNotImplementedMeta
|
||||
|
||||
@ -71,4 +85,5 @@ class MixinTestsWithBackendScenarios(object):
|
||||
('sqlalchemy', dict(database_connection='sqlite://')),
|
||||
('mongodb', dict(database_connection=MongoDBFakeConnectionUrl())),
|
||||
('hbase', dict(database_connection='hbase://__test__')),
|
||||
('db2', dict(database_connection=DB2FakeConnectionUrl())),
|
||||
]
|
||||
|
@ -25,7 +25,7 @@ fi
|
||||
MONGO_DATA=`mktemp -d /tmp/CEILO-MONGODB-XXXXX`
|
||||
trap "clean_exit" EXIT
|
||||
mkfifo ${MONGO_DATA}/out
|
||||
mongod --maxConns 32 --nojournal --noprealloc --smallfiles --quiet --noauth --port 29000 --dbpath "${MONGO_DATA}" --bind_ip localhost &>${MONGO_DATA}/out &
|
||||
mongod --maxConns 128 --nojournal --noprealloc --smallfiles --quiet --noauth --port 29000 --dbpath "${MONGO_DATA}" --bind_ip localhost &>${MONGO_DATA}/out &
|
||||
MONGO_PID=$!
|
||||
# Wait for Mongo to start listening to connections
|
||||
while read line
|
||||
|
@ -1,144 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
#
|
||||
# Copyright © 2012 New Dream Network, LLC (DreamHost)
|
||||
# Copyright © 2012 IBM Corp
|
||||
#
|
||||
# Author: Doug Hellmann <doug.hellmann@dreamhost.com>
|
||||
# Tong Li <litong01@us.ibm.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.
|
||||
"""Tests for ceilometer/storage/impl_db2.py
|
||||
|
||||
.. note::
|
||||
In order to run the tests against another DB2 server set the
|
||||
environment variable CEILOMETER_TEST_DB2_URL to point to a DB2
|
||||
server before running the tests.
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
from ceilometer import storage
|
||||
from ceilometer.storage import models
|
||||
from ceilometer.tests import db as tests_db
|
||||
from tests.storage import base
|
||||
|
||||
|
||||
class TestCaseConnectionUrl(tests_db.MongoDBFakeConnectionUrl):
|
||||
|
||||
def __init__(self):
|
||||
self.url = (os.environ.get('CEILOMETER_TEST_DB2_URL') or
|
||||
os.environ.get('CEILOMETER_TEST_MONGODB_URL'))
|
||||
if not self.url:
|
||||
raise RuntimeError(
|
||||
"No DB2 test URL set, "
|
||||
"export CEILOMETER_TEST_DB2_URL environment variable")
|
||||
else:
|
||||
# This is to make sure that the db2 driver is used when
|
||||
# CEILOMETER_TEST_DB2_URL was not set
|
||||
self.url = self.url.replace('mongodb:', 'db2:', 1)
|
||||
|
||||
|
||||
class DB2EngineTestBase(base.DBTestBase):
|
||||
database_connection = TestCaseConnectionUrl()
|
||||
|
||||
|
||||
class ConnectionTest(DB2EngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class UserTest(base.UserTest, DB2EngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ProjectTest(base.ProjectTest, DB2EngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ResourceTest(base.ResourceTest, DB2EngineTestBase):
|
||||
|
||||
def test_get_resources(self):
|
||||
msgs_sources = [msg['source'] for msg in self.msgs]
|
||||
resources = list(self.conn.get_resources())
|
||||
self.assertEqual(len(resources), 9)
|
||||
for resource in resources:
|
||||
if resource.resource_id != 'resource-id':
|
||||
continue
|
||||
self.assertEqual(resource.first_sample_timestamp,
|
||||
None)
|
||||
self.assertEqual(resource.last_sample_timestamp,
|
||||
None)
|
||||
assert resource.resource_id == 'resource-id'
|
||||
assert resource.project_id == 'project-id'
|
||||
self.assertIn(resource.source, msgs_sources)
|
||||
assert resource.user_id == 'user-id'
|
||||
assert resource.metadata['display_name'] == 'test-server'
|
||||
self.assertIn(models.ResourceMeter('instance', 'cumulative', ''),
|
||||
resource.meter)
|
||||
break
|
||||
else:
|
||||
assert False, 'Never found resource-id'
|
||||
|
||||
|
||||
class MeterTest(base.MeterTest, DB2EngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class RawSampleTest(base.RawSampleTest, DB2EngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class StatisticsTest(base.StatisticsTest, DB2EngineTestBase):
|
||||
|
||||
def test_by_user_period_with_timezone(self):
|
||||
f = storage.SampleFilter(
|
||||
user='user-5',
|
||||
meter='volume.size',
|
||||
start='2012-09-25T00:28:00-10:00Z'
|
||||
)
|
||||
try:
|
||||
self.conn.get_meter_statistics(f, period=7200)
|
||||
got_not_imp = False
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
|
||||
def test_by_user_period(self):
|
||||
f = storage.SampleFilter(
|
||||
user='user-5',
|
||||
meter='volume.size',
|
||||
start='2012-09-25T10:28:00',
|
||||
)
|
||||
try:
|
||||
self.conn.get_meter_statistics(f, period=7200)
|
||||
got_not_imp = False
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
|
||||
def test_by_user_period_start_end(self):
|
||||
f = storage.SampleFilter(
|
||||
user='user-5',
|
||||
meter='volume.size',
|
||||
start='2012-09-25T10:28:00',
|
||||
end='2012-09-25T11:28:00',
|
||||
)
|
||||
try:
|
||||
self.conn.get_meter_statistics(f, period=1800)
|
||||
got_not_imp = False
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
|
||||
|
||||
class CounterDataTypeTest(base.CounterDataTypeTest, DB2EngineTestBase):
|
||||
pass
|
@ -28,10 +28,10 @@ from oslo.config import cfg
|
||||
|
||||
from ceilometer.storage.impl_hbase import Connection
|
||||
from ceilometer.storage.impl_hbase import MConnection
|
||||
from tests.storage import base
|
||||
from ceilometer.tests import db as tests_db
|
||||
|
||||
|
||||
class HBaseEngineTestBase(base.DBTestBase):
|
||||
class HBaseEngineTestBase(tests_db.TestBase):
|
||||
database_connection = 'hbase://__test__'
|
||||
|
||||
|
||||
@ -54,31 +54,3 @@ class ConnectionTest(HBaseEngineTestBase):
|
||||
lambda self, x: TestConn(x['host'], x['port']))
|
||||
conn = Connection(cfg.CONF)
|
||||
self.assertIsInstance(conn.conn, TestConn)
|
||||
|
||||
|
||||
class UserTest(base.UserTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ProjectTest(base.ProjectTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ResourceTest(base.ResourceTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class MeterTest(base.MeterTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class RawSampleTest(base.RawSampleTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class StatisticsTest(base.StatisticsTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class CounterDataTypeTest(base.CounterDataTypeTest, HBaseEngineTestBase):
|
||||
pass
|
||||
|
@ -30,18 +30,18 @@ import uuid
|
||||
|
||||
from oslo.config import cfg
|
||||
|
||||
from tests.storage import base
|
||||
|
||||
from ceilometer.publisher import rpc
|
||||
from ceilometer import sample
|
||||
from ceilometer.storage import impl_mongodb
|
||||
from ceilometer.storage import models
|
||||
from ceilometer.tests import db as tests_db
|
||||
from ceilometer.storage.base import NoResultFound
|
||||
from ceilometer.storage.base import MultipleResultsFound
|
||||
from ceilometer.tests import db as tests_db
|
||||
|
||||
from tests.storage import test_storage_scenarios
|
||||
|
||||
|
||||
class MongoDBEngineTestBase(base.DBTestBase):
|
||||
class MongoDBEngineTestBase(tests_db.TestBase):
|
||||
database_connection = tests_db.MongoDBFakeConnectionUrl()
|
||||
|
||||
|
||||
@ -69,7 +69,8 @@ class MongoDBConnection(MongoDBEngineTestBase):
|
||||
self.assertEqual(ret, expect)
|
||||
|
||||
|
||||
class MongoDBTestMarkerBase(MongoDBEngineTestBase):
|
||||
class MongoDBTestMarkerBase(test_storage_scenarios.DBTestBase,
|
||||
MongoDBEngineTestBase):
|
||||
#NOTE(Fengqian): All these three test case are the same for resource
|
||||
#and meter collection. As to alarm, we will set up in AlarmTestPagination.
|
||||
def test_get_marker(self):
|
||||
@ -79,8 +80,8 @@ class MongoDBTestMarkerBase(MongoDBEngineTestBase):
|
||||
self.assertEqual(ret['project_id'], 'project-id-4')
|
||||
|
||||
def test_get_marker_None(self):
|
||||
marker_pairs = {'user_id': 'user-id-foo'}
|
||||
try:
|
||||
marker_pairs = {'user_id': 'user-id-foo'}
|
||||
ret = impl_mongodb.Connection._get_marker(self.conn.db.resource,
|
||||
marker_pairs)
|
||||
self.assertEqual(ret['project_id'], 'project-id-foo')
|
||||
@ -124,61 +125,8 @@ class IndexTest(MongoDBEngineTestBase):
|
||||
name='meter_ttl'))
|
||||
|
||||
|
||||
class UserTest(base.UserTest, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ProjectTest(base.ProjectTest, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ResourceTest(base.ResourceTest, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class MeterTest(base.MeterTest, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class MeterTestPagination(base.MeterTestPagination, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class RawSampleTest(base.RawSampleTest, MongoDBEngineTestBase):
|
||||
# NOTE(jd) Override this test in MongoDB because our code doesn't clear
|
||||
# the collections, this is handled by MongoDB TTL feature.
|
||||
def test_clear_metering_data(self):
|
||||
pass
|
||||
|
||||
|
||||
class StatisticsTest(base.StatisticsTest, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class AlarmTest(base.AlarmTest, MongoDBEngineTestBase):
|
||||
def prepare_old_matching_metadata_alarm(self):
|
||||
alarm = models.Alarm('old-alert',
|
||||
'test.one', 'eq', 36, 'count',
|
||||
'me', 'and-da-boys',
|
||||
evaluation_periods=1,
|
||||
period=60,
|
||||
alarm_actions=['http://nowhere/alarms'],
|
||||
matching_metadata={'key': 'value'})
|
||||
alarm.alarm_id = str(uuid.uuid1())
|
||||
data = alarm.as_dict()
|
||||
self.conn.db.alarm.update(
|
||||
{'alarm_id': alarm.alarm_id},
|
||||
{'$set': data},
|
||||
upsert=True)
|
||||
|
||||
def test_alarm_get_old_matching_metadata_format(self):
|
||||
self.prepare_old_matching_metadata_alarm()
|
||||
old = list(self.conn.get_alarms(name='old-alert'))[0]
|
||||
self.assertEqual(old.matching_metadata, {'key': 'value'})
|
||||
|
||||
|
||||
class CompatibilityTest(MongoDBEngineTestBase):
|
||||
|
||||
class CompatibilityTest(test_storage_scenarios.DBTestBase,
|
||||
MongoDBEngineTestBase):
|
||||
def prepare_data(self):
|
||||
def old_record_metering_data(self, data):
|
||||
self.db.user.update(
|
||||
@ -244,13 +192,33 @@ class CompatibilityTest(MongoDBEngineTestBase):
|
||||
secret='not-so-secret')
|
||||
self.conn.record_metering_data(self.conn, msg)
|
||||
|
||||
# Create the old format alarm with a dict instead of a
|
||||
# array for matching_metadata
|
||||
alarm = models.Alarm('old-alert',
|
||||
'test.one', 'eq', 36, 'count',
|
||||
'me', 'and-da-boys',
|
||||
evaluation_periods=1,
|
||||
period=60,
|
||||
alarm_actions=['http://nowhere/alarms'],
|
||||
matching_metadata={'key': 'value'})
|
||||
alarm.alarm_id = str(uuid.uuid1())
|
||||
data = alarm.as_dict()
|
||||
self.conn.db.alarm.update(
|
||||
{'alarm_id': alarm.alarm_id},
|
||||
{'$set': data},
|
||||
upsert=True)
|
||||
|
||||
def test_alarm_get_old_matching_metadata_format(self):
|
||||
old = list(self.conn.get_alarms(name='old-alert'))[0]
|
||||
self.assertEqual(old.matching_metadata, {'key': 'value'})
|
||||
|
||||
def test_counter_unit(self):
|
||||
meters = list(self.conn.get_meters())
|
||||
self.assertEqual(len(meters), 1)
|
||||
|
||||
|
||||
class AlarmTestPagination(base.AlarmTestPagination, MongoDBEngineTestBase):
|
||||
|
||||
class AlarmTestPagination(test_storage_scenarios.AlarmTestBase,
|
||||
MongoDBEngineTestBase):
|
||||
def test_alarm_get_marker(self):
|
||||
self.add_some_alarms()
|
||||
marker_pairs = {'name': 'red-alert'}
|
||||
@ -277,7 +245,3 @@ class AlarmTestPagination(base.AlarmTestPagination, MongoDBEngineTestBase):
|
||||
self.assertEqual(ret['counter_name'], 'counter-name-foo')
|
||||
except MultipleResultsFound:
|
||||
self.assertTrue(True)
|
||||
|
||||
|
||||
class CounterDataTypeTest(base.CounterDataTypeTest, MongoDBEngineTestBase):
|
||||
pass
|
||||
|
@ -28,59 +28,16 @@ import datetime
|
||||
from ceilometer.storage import models
|
||||
from ceilometer.storage.sqlalchemy.models import table_args
|
||||
from ceilometer import utils
|
||||
from tests.storage import base
|
||||
from ceilometer.tests import db as tests_db
|
||||
|
||||
|
||||
class SQLAlchemyEngineTestBase(base.DBTestBase):
|
||||
database_connection = 'sqlite://'
|
||||
|
||||
|
||||
class UserTest(base.UserTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ProjectTest(base.ProjectTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ResourceTest(base.ResourceTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class MeterTest(base.MeterTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class RawSampleTest(base.RawSampleTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class StatisticsTest(base.StatisticsTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class StatisticsGroupByTest(base.StatisticsGroupByTest,
|
||||
SQLAlchemyEngineTestBase):
|
||||
# This is not implemented
|
||||
def test_group_by_source(self):
|
||||
pass
|
||||
|
||||
|
||||
class CounterDataTypeTest(base.CounterDataTypeTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class AlarmTest(base.AlarmTest, SQLAlchemyEngineTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class EventTestBase(base.EventTestBase):
|
||||
class EventTestBase(tests_db.TestBase):
|
||||
# Note: Do not derive from SQLAlchemyEngineTestBase, since we
|
||||
# don't want to automatically inherit all the Meter setup.
|
||||
database_connection = 'sqlite://'
|
||||
|
||||
|
||||
class UniqueNameTest(base.EventTest, EventTestBase):
|
||||
class UniqueNameTest(EventTestBase):
|
||||
# UniqueName is a construct specific to sqlalchemy.
|
||||
# Not applicable to other drivers.
|
||||
|
||||
@ -99,7 +56,7 @@ class UniqueNameTest(base.EventTest, EventTestBase):
|
||||
self.assertNotEqual(u1.key, u2.key)
|
||||
|
||||
|
||||
class EventTest(base.EventTest, EventTestBase):
|
||||
class EventTest(EventTestBase):
|
||||
def test_string_traits(self):
|
||||
model = models.Trait("Foo", models.Trait.TEXT_TYPE, "my_text")
|
||||
trait = self.conn._make_trait(model, None)
|
||||
@ -142,11 +99,7 @@ class EventTest(base.EventTest, EventTestBase):
|
||||
self.assertIsNotNone(trait.name)
|
||||
|
||||
|
||||
class GetEventTest(base.GetEventTest, EventTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class ModelTest(SQLAlchemyEngineTestBase):
|
||||
class ModelTest(tests_db.TestBase):
|
||||
database_connection = 'mysql://localhost'
|
||||
|
||||
def test_model_table_args(self):
|
||||
|
@ -16,11 +16,11 @@
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
""" Base classes for DB backend implemtation test
|
||||
"""
|
||||
|
||||
import datetime
|
||||
import testscenarios
|
||||
|
||||
from oslo.config import cfg
|
||||
|
||||
@ -28,12 +28,13 @@ from ceilometer.publisher import rpc
|
||||
from ceilometer.openstack.common import timeutils
|
||||
from ceilometer import sample
|
||||
from ceilometer import storage
|
||||
from ceilometer.tests import db as test_db
|
||||
from ceilometer.tests import db as tests_db
|
||||
from ceilometer.storage import models
|
||||
|
||||
load_tests = testscenarios.load_tests_apply_scenarios
|
||||
|
||||
class DBTestBase(test_db.TestBase):
|
||||
|
||||
class DBTestBase(tests_db.TestBase):
|
||||
def setUp(self):
|
||||
super(DBTestBase, self).setUp()
|
||||
self.prepare_data()
|
||||
@ -165,7 +166,8 @@ class DBTestBase(test_db.TestBase):
|
||||
self.msgs.append(msg)
|
||||
|
||||
|
||||
class UserTest(DBTestBase):
|
||||
class UserTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_users(self):
|
||||
users = self.conn.get_users()
|
||||
@ -179,7 +181,8 @@ class UserTest(DBTestBase):
|
||||
assert list(users) == ['user-id']
|
||||
|
||||
|
||||
class ProjectTest(DBTestBase):
|
||||
class ProjectTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_projects(self):
|
||||
projects = self.conn.get_projects()
|
||||
@ -194,9 +197,19 @@ class ProjectTest(DBTestBase):
|
||||
assert list(projects) == expected
|
||||
|
||||
|
||||
class ResourceTest(DBTestBase):
|
||||
class ResourceTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_resources(self):
|
||||
expected_first_sample_timestamp = datetime.datetime(2012, 7, 2, 10, 39)
|
||||
expected_last_sample_timestamp = datetime.datetime(2012, 7, 2, 10, 40)
|
||||
|
||||
#note(sileht): This is not normal, all backends should
|
||||
# the same data...
|
||||
if cfg.CONF.database.connection.startswith('db2://'):
|
||||
expected_first_sample_timestamp = None
|
||||
expected_last_sample_timestamp = None
|
||||
|
||||
msgs_sources = [msg['source'] for msg in self.msgs]
|
||||
resources = list(self.conn.get_resources())
|
||||
self.assertEqual(len(resources), 9)
|
||||
@ -204,9 +217,9 @@ class ResourceTest(DBTestBase):
|
||||
if resource.resource_id != 'resource-id':
|
||||
continue
|
||||
self.assertEqual(resource.first_sample_timestamp,
|
||||
datetime.datetime(2012, 7, 2, 10, 39))
|
||||
expected_first_sample_timestamp)
|
||||
self.assertEqual(resource.last_sample_timestamp,
|
||||
datetime.datetime(2012, 7, 2, 10, 40))
|
||||
expected_last_sample_timestamp)
|
||||
assert resource.resource_id == 'resource-id'
|
||||
assert resource.project_id == 'project-id'
|
||||
self.assertIn(resource.source, msgs_sources)
|
||||
@ -315,26 +328,16 @@ class ResourceTest(DBTestBase):
|
||||
|
||||
def test_get_resources_by_metaquery(self):
|
||||
q = {'metadata.display_name': 'test-server'}
|
||||
got_not_imp = False
|
||||
try:
|
||||
resources = list(self.conn.get_resources(metaquery=q))
|
||||
self.assertEqual(len(resources), 9)
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
#this should work, but it doesn't.
|
||||
#actually unless I wrap get_resources in list()
|
||||
#it doesn't get called - weird
|
||||
#self.assertRaises(NotImplementedError,
|
||||
# self.conn.get_resources,
|
||||
# metaquery=q)
|
||||
resources = list(self.conn.get_resources(metaquery=q))
|
||||
self.assertEqual(len(resources), 9)
|
||||
|
||||
def test_get_resources_by_empty_metaquery(self):
|
||||
resources = list(self.conn.get_resources(metaquery={}))
|
||||
self.assertEqual(len(resources), 9)
|
||||
|
||||
|
||||
class ResourceTestPagination(DBTestBase):
|
||||
class ResourceTestPagination(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_resource_all_limit(self):
|
||||
results = list(self.conn.get_resources(limit=8))
|
||||
@ -376,7 +379,8 @@ class ResourceTestPagination(DBTestBase):
|
||||
[i.resource_id for i in results])
|
||||
|
||||
|
||||
class MeterTest(DBTestBase):
|
||||
class MeterTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_meters(self):
|
||||
msgs_sources = [msg['source'] for msg in self.msgs]
|
||||
@ -395,21 +399,17 @@ class MeterTest(DBTestBase):
|
||||
|
||||
def test_get_meters_by_metaquery(self):
|
||||
q = {'metadata.display_name': 'test-server'}
|
||||
got_not_imp = False
|
||||
try:
|
||||
results = list(self.conn.get_meters(metaquery=q))
|
||||
assert results
|
||||
self.assertEqual(len(results), 9)
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
results = list(self.conn.get_meters(metaquery=q))
|
||||
assert results
|
||||
self.assertEqual(len(results), 9)
|
||||
|
||||
def test_get_meters_by_empty_metaquery(self):
|
||||
results = list(self.conn.get_meters(metaquery={}))
|
||||
self.assertEqual(len(results), 9)
|
||||
|
||||
|
||||
class MeterTestPagination(DBTestBase):
|
||||
class MeterTestPagination(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def tet_get_meters_all_limit(self):
|
||||
results = list(self.conn.get_meters(limit=8))
|
||||
@ -453,7 +453,8 @@ class MeterTestPagination(DBTestBase):
|
||||
self.assertEqual([], [i.user_id for i in results])
|
||||
|
||||
|
||||
class RawSampleTest(DBTestBase):
|
||||
class RawSampleTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_samples_limit_zero(self):
|
||||
f = storage.SampleFilter()
|
||||
@ -509,15 +510,10 @@ class RawSampleTest(DBTestBase):
|
||||
def test_get_samples_by_metaquery(self):
|
||||
q = {'metadata.display_name': 'test-server'}
|
||||
f = storage.SampleFilter(metaquery=q)
|
||||
got_not_imp = False
|
||||
try:
|
||||
results = list(self.conn.get_samples(f))
|
||||
assert results
|
||||
for meter in results:
|
||||
assert meter.as_dict() in self.msgs
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
results = list(self.conn.get_samples(f))
|
||||
assert results
|
||||
for meter in results:
|
||||
assert meter.as_dict() in self.msgs
|
||||
|
||||
def test_get_samples_by_start_time(self):
|
||||
timestamp = datetime.datetime(2012, 7, 2, 10, 41)
|
||||
@ -611,15 +607,13 @@ class RawSampleTest(DBTestBase):
|
||||
self.assertEqual(len(results), 2)
|
||||
|
||||
def test_clear_metering_data(self):
|
||||
timeutils.utcnow.override_time = datetime.datetime(2012, 7, 2, 10, 45)
|
||||
|
||||
try:
|
||||
self.conn.clear_expired_metering_data(3 * 60)
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
# NOTE(jd) Override this test in MongoDB because our code doesn't clear
|
||||
# the collections, this is handled by MongoDB TTL feature.
|
||||
if cfg.CONF.database.connection.startswith('mongodb://'):
|
||||
return
|
||||
|
||||
timeutils.utcnow.override_time = datetime.datetime(2012, 7, 2, 10, 45)
|
||||
self.conn.clear_expired_metering_data(3 * 60)
|
||||
f = storage.SampleFilter(meter='instance')
|
||||
results = list(self.conn.get_samples(f))
|
||||
self.assertEqual(len(results), 5)
|
||||
@ -631,15 +625,13 @@ class RawSampleTest(DBTestBase):
|
||||
self.assertEqual(len(results), 5)
|
||||
|
||||
def test_clear_metering_data_no_data_to_remove(self):
|
||||
timeutils.utcnow.override_time = datetime.datetime(2010, 7, 2, 10, 45)
|
||||
|
||||
try:
|
||||
self.conn.clear_expired_metering_data(3 * 60)
|
||||
except NotImplementedError:
|
||||
got_not_imp = True
|
||||
self.assertTrue(got_not_imp)
|
||||
# NOTE(jd) Override this test in MongoDB because our code doesn't clear
|
||||
# the collections, this is handled by MongoDB TTL feature.
|
||||
if cfg.CONF.database.connection.startswith('mongodb://'):
|
||||
return
|
||||
|
||||
timeutils.utcnow.override_time = datetime.datetime(2010, 7, 2, 10, 45)
|
||||
self.conn.clear_expired_metering_data(3 * 60)
|
||||
f = storage.SampleFilter(meter='instance')
|
||||
results = list(self.conn.get_samples(f))
|
||||
self.assertEqual(len(results), 11)
|
||||
@ -651,7 +643,8 @@ class RawSampleTest(DBTestBase):
|
||||
self.assertEqual(len(results), 9)
|
||||
|
||||
|
||||
class StatisticsTest(DBTestBase):
|
||||
class StatisticsTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def prepare_data(self):
|
||||
for i in range(3):
|
||||
@ -861,7 +854,8 @@ class StatisticsTest(DBTestBase):
|
||||
assert results.avg == 6
|
||||
|
||||
|
||||
class StatisticsGroupByTest(DBTestBase):
|
||||
class StatisticsGroupByTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def prepare_data(self):
|
||||
test_sample_data = (
|
||||
@ -1416,8 +1410,8 @@ class StatisticsGroupByTest(DBTestBase):
|
||||
pass
|
||||
|
||||
|
||||
class CounterDataTypeTest(DBTestBase):
|
||||
|
||||
class CounterDataTypeTest(DBTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
def prepare_data(self):
|
||||
c = sample.Sample(
|
||||
'dummyBigCounter',
|
||||
@ -1496,7 +1490,6 @@ class CounterDataTypeTest(DBTestBase):
|
||||
|
||||
|
||||
class AlarmTestBase(DBTestBase):
|
||||
|
||||
def add_some_alarms(self):
|
||||
alarms = [models.Alarm('red-alert',
|
||||
'test.one', 'eq', 36, 'count',
|
||||
@ -1522,7 +1515,8 @@ class AlarmTestBase(DBTestBase):
|
||||
self.conn.update_alarm(a)
|
||||
|
||||
|
||||
class AlarmTest(AlarmTestBase):
|
||||
class AlarmTest(AlarmTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_empty(self):
|
||||
alarms = list(self.conn.get_alarms())
|
||||
@ -1584,7 +1578,8 @@ class AlarmTest(AlarmTestBase):
|
||||
self.assertNotEquals(victim.name, s.name)
|
||||
|
||||
|
||||
class AlarmTestPagination(AlarmTestBase):
|
||||
class AlarmTestPagination(AlarmTestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
|
||||
def test_get_alarm_all_limit(self):
|
||||
self.add_some_alarms()
|
||||
@ -1648,7 +1643,8 @@ class AlarmTestPagination(AlarmTestBase):
|
||||
self.assertEqual(['red-alert'], [i.name for i in page1])
|
||||
|
||||
|
||||
class EventTestBase(test_db.TestBase):
|
||||
class EventTestBase(tests_db.TestBase,
|
||||
tests_db.MixinTestsWithBackendScenarios):
|
||||
"""Separate test base class because we don't want to
|
||||
inherit all the Meter stuff.
|
||||
"""
|
Loading…
Reference in New Issue
Block a user