# Copyright 2015 Mirantis, Inc. # 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. import logging try: from oslo.serialization import jsonutils except ImportError: from oslo_serialization import jsonutils import random import StringIO import fuel_health.common.ssh from fuel_health.common.utils.data_utils import rand_name import fuel_health.nmanager import fuel_health.test LOG = logging.getLogger(__name__) class GlanceTest(fuel_health.nmanager.NovaNetworkScenarioTest): """Manager that provides access to the Glance python client for calling Glance API. """ @classmethod def setUpClass(cls): super(GlanceTest, cls).setUpClass() cls.images = [] if cls.manager.clients_initialized: if not cls.glance_client_v1: LOG.warning('Glance client v1 was not initialized') if not cls.glance_client: LOG.warning('Glance client v2 was not initialized') if not cls.glance_client_v1 and not cls.glance_client: cls.fail('Glance client v1 and v2 was not initialized') def tearDown(self): LOG.debug("Deleting images created by Glance test") self._clean_images() super(GlanceTest, self).tearDown() def _list_images(self, client): return client.images.list() def image_create(self, client, **kwargs): container_format = 'bare' data = StringIO.StringIO( ''.join([chr(random.randint(0, 255)) for i in range(1024)])) disk_format = 'raw' image_name = rand_name('ostf_test-image_glance-') if client is self.glance_client_v1: image = client.images.create(name=image_name, container_format=container_format, data=data, disk_format=disk_format, **kwargs) self.images.append(image.id) return image elif client is self.glance_client: # TODO(vryzhenkin): Rework this function using Glance Tasks v2, # TODO(vryzhenkin) when Tasks will be supported by OpenStack Glance image = client.images.create(name=image_name, container_format=container_format, disk_format=disk_format, **kwargs) client.images.upload(image.id, 'dummy_data') self.images.append(image.id) return image def find_image_by_id(self, client, image_id): return client.images.get(image_id) def delete_image(self, client, object): client.images.delete(object) if client is self.glance_client_v1: return self.images.remove(object.id) else: return self.images.remove(object) def check_image_status(self, client, image, status='active'): def image_status_comparison(): if self.find_image_by_id(client, image.id).status == status: return True if fuel_health.test.call_until_true(image_status_comparison, 180, 5): return self.find_image_by_id(client, image.id) else: self.fail('Image has incorrect status {0}' .format(self.find_image_by_id(client, image.id))) def update_image(self, client, object, group_props, prop, value_prop): if client is self.glance_client_v1: properties = object.properties properties[group_props] = jsonutils.dumps({prop: value_prop}) return client.images.update(object, properties=properties) elif client is self.glance_client: properties = '{0}: {1}'.format(prop, value_prop) return client.images.update(object, group_props=properties) def find_props(self, client, object, group_props, prop, value_prop): msg = 'Can not find created properties in image' if client is self.glance_client_v1: for group in object.properties: if group == group_props: for i in jsonutils.loads(object.properties[group]): k = jsonutils.loads(object.properties[group])[prop] if i == prop and k == unicode(value_prop): return 'OK' else: self.fail(msg) else: self.fail(msg) elif client is self.glance_client: properties = '{0}: {1}'.format(prop, value_prop) for key in object: if object[key] == properties: return 'OK' self.fail(msg)