147 lines
5.6 KiB
Python
147 lines
5.6 KiB
Python
# Copyright 2014 Red Hat
|
|
#
|
|
# 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 oslo_log import log as logging
|
|
from tempest.common import utils
|
|
from tempest import config
|
|
from tempest.lib.common.utils import data_utils
|
|
from tempest.lib.common.utils import test_utils
|
|
from tempest.lib import decorators
|
|
from tempest import test
|
|
|
|
from ceilometer.tests.tempest.service import client
|
|
|
|
|
|
CONF = config.CONF
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class ClientManager(client.Manager):
|
|
|
|
load_clients = [
|
|
'telemetry_client',
|
|
'container_client',
|
|
'object_client',
|
|
]
|
|
|
|
|
|
class TestObjectStorageTelemetry(test.BaseTestCase):
|
|
"""Test that swift uses the ceilometer middleware.
|
|
|
|
* create container.
|
|
* upload a file to the created container.
|
|
* retrieve the file from the created container.
|
|
* wait for notifications from ceilometer.
|
|
"""
|
|
|
|
credentials = ['primary']
|
|
client_manager = ClientManager
|
|
|
|
@classmethod
|
|
def skip_checks(cls):
|
|
super(TestObjectStorageTelemetry, cls).skip_checks()
|
|
if ("gnocchi" in CONF.service_available and
|
|
CONF.service_available.gnocchi):
|
|
skip_msg = ("%s skipped as gnocchi is enabled" %
|
|
cls.__name__)
|
|
raise cls.skipException(skip_msg)
|
|
if not CONF.service_available.swift:
|
|
skip_msg = ("%s skipped as swift is not available" %
|
|
cls.__name__)
|
|
raise cls.skipException(skip_msg)
|
|
if not CONF.service_available.ceilometer:
|
|
skip_msg = ("%s skipped as ceilometer is not available" %
|
|
cls.__name__)
|
|
raise cls.skipException(skip_msg)
|
|
|
|
@classmethod
|
|
def setup_credentials(cls):
|
|
cls.set_network_resources()
|
|
super(TestObjectStorageTelemetry, cls).setup_credentials()
|
|
|
|
@classmethod
|
|
def setup_clients(cls):
|
|
super(TestObjectStorageTelemetry, cls).setup_clients()
|
|
cls.telemetry_client = cls.os_primary.telemetry_client
|
|
cls.container_client = cls.os_primary.container_client
|
|
cls.object_client = cls.os_primary.object_client
|
|
|
|
def _confirm_notifications(self, container_name, obj_name):
|
|
# NOTE: Loop seeking for appropriate notifications about the containers
|
|
# and objects sent to swift.
|
|
|
|
def _check_samples():
|
|
# NOTE: Return True only if we have notifications about some
|
|
# containers and some objects and the notifications are about
|
|
# the expected containers and objects.
|
|
# Otherwise returning False will case _check_samples to be
|
|
# called again.
|
|
results = self.telemetry_client.list_samples(
|
|
'storage.objects.incoming.bytes')
|
|
LOG.debug('got samples %s', results)
|
|
|
|
# Extract container info from samples.
|
|
containers, objects = [], []
|
|
for sample in results:
|
|
meta = sample['resource_metadata']
|
|
if meta.get('container') and meta['container'] != 'None':
|
|
containers.append(meta['container'])
|
|
elif (meta.get('target.metadata:container') and
|
|
meta['target.metadata:container'] != 'None'):
|
|
containers.append(meta['target.metadata:container'])
|
|
|
|
if meta.get('object') and meta['object'] != 'None':
|
|
objects.append(meta['object'])
|
|
elif (meta.get('target.metadata:object') and
|
|
meta['target.metadata:object'] != 'None'):
|
|
objects.append(meta['target.metadata:object'])
|
|
|
|
return (container_name in containers and obj_name in objects)
|
|
|
|
self.assertTrue(
|
|
test_utils.call_until_true(_check_samples,
|
|
CONF.telemetry.notification_wait,
|
|
CONF.telemetry.notification_sleep),
|
|
'Correct notifications were not received after '
|
|
'%s seconds.' % CONF.telemetry.notification_wait)
|
|
|
|
def create_container(self):
|
|
name = data_utils.rand_name('swift-scenario-container')
|
|
self.container_client.create_container(name)
|
|
# look for the container to assure it is created
|
|
self.container_client.list_container_objects(name)
|
|
LOG.debug('Container %s created' % (name))
|
|
self.addCleanup(self.container_client.delete_container,
|
|
name)
|
|
return name
|
|
|
|
def upload_object_to_container(self, container_name):
|
|
obj_name = data_utils.rand_name('swift-scenario-object')
|
|
obj_data = data_utils.arbitrary_string()
|
|
self.object_client.create_object(container_name, obj_name, obj_data)
|
|
self.addCleanup(self.object_client.delete_object,
|
|
container_name,
|
|
obj_name)
|
|
return obj_name
|
|
|
|
@decorators.idempotent_id('6d6b88e5-3e38-41bc-b34a-79f713a6cb85')
|
|
@utils.services('object_storage')
|
|
def test_swift_middleware_notifies(self):
|
|
container_name = self.create_container()
|
|
obj_name = self.upload_object_to_container(container_name)
|
|
self._confirm_notifications(container_name, obj_name)
|