trove/trove/tests/util/usage.py

85 lines
2.9 KiB
Python

# Copyright (c) 2013 Rackspace Hosting
# All Rights Reserved.
#
# 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.
from collections import defaultdict
from oslo_log import log as logging
import proboscis.asserts as asserts
from proboscis.dependencies import SkipTest
from trove.common import utils
from trove.tests.config import CONFIG
LOG = logging.getLogger(__name__)
MESSAGE_QUEUE = defaultdict(list)
def create_usage_verifier():
return utils.import_object(CONFIG.usage_endpoint)
class UsageVerifier(object):
def clear_events(self):
"""Hook that is called to allow endpoints to clean up."""
pass
def check_message(self, resource_id, event_type, **attrs):
messages = utils.poll_until(lambda: self.get_messages(resource_id),
lambda x: len(x) > 0, time_out=30)
found = None
for message in messages:
if message['event_type'] == event_type:
found = message
asserts.assert_is_not_none(found,
"No message type %s for resource %s" %
(event_type, resource_id))
with asserts.Check() as check:
for key, value in attrs.items():
check.equal(found[key], value)
def get_messages(self, resource_id, expected_messages=None):
global MESSAGE_QUEUE
msgs = MESSAGE_QUEUE.get(resource_id, [])
if expected_messages is not None:
asserts.assert_equal(len(msgs), expected_messages)
return msgs
class FakeVerifier(object):
"""This is the default handler in fake mode, it is basically a no-op."""
def clear_events(self):
pass
def check_message(self, *args, **kwargs):
raise SkipTest("Notifications not available")
def get_messages(self, *args, **kwargs):
pass
def notify(event_type, payload):
"""Simple test notify function which saves the messages to global list."""
payload['event_type'] = event_type
if 'instance_id' in payload and 'server_type' not in payload:
LOG.debug('Received Usage Notification: %s', event_type)
resource_id = payload['instance_id']
global MESSAGE_QUEUE
MESSAGE_QUEUE[resource_id].append(payload)
LOG.debug('Message Queue for %(id)s now has %(msg_count)d messages',
{'id': resource_id,
'msg_count': len(MESSAGE_QUEUE[resource_id])})