blob: b7f89144474e18298e940f47c7fec363d3ecebdf [file] [log] [blame]
Brianna Poulos011292a2017-03-15 16:24:38 -04001# Copyright 2012 OpenStack Foundation
2# Copyright 2013 IBM Corp.
3# All Rights Reserved.
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
16
17from oslo_log import log
18
Brianna Poulos011292a2017-03-15 16:24:38 -040019from tempest.common import image as common_image
20from tempest.common import waiters
21from tempest import config
22from tempest.lib.common.utils import data_utils
Brianna Poulos011292a2017-03-15 16:24:38 -040023from tempest.lib import exceptions as lib_exc
Ihar Hrachyshkaecce1f62018-01-18 13:32:05 -080024from tempest.scenario import manager
Brianna Poulos011292a2017-03-15 16:24:38 -040025
26CONF = config.CONF
27
28LOG = log.getLogger(__name__)
29
30
Ihar Hrachyshka2d0cf0a2018-01-18 13:40:09 -080031# we inherit from NetworkScenarioTest since some test cases need access to
32# check_*_connectivity methods to validate instances are up and accessible
33class ScenarioTest(manager.NetworkScenarioTest):
Brianna Poulos011292a2017-03-15 16:24:38 -040034 """Base class for scenario tests. Uses tempest own clients. """
Brianna Poulos011292a2017-03-15 16:24:38 -040035 # ## Test functions library
36 #
37 # The create_[resource] functions only return body and discard the
38 # resp part which is not used in scenario tests
Brianna Poulos011292a2017-03-15 16:24:38 -040039
Brianna Poulos011292a2017-03-15 16:24:38 -040040 def _image_create(self, name, fmt, path,
41 disk_format=None, properties=None):
42 if properties is None:
43 properties = {}
44 name = data_utils.rand_name('%s-' % name)
45 params = {
46 'name': name,
47 'container_format': fmt,
48 'disk_format': disk_format or fmt,
49 }
50 if CONF.image_feature_enabled.api_v1:
51 params['is_public'] = 'False'
52 params['properties'] = properties
53 params = {'headers': common_image.image_meta_to_headers(**params)}
54 else:
55 params['visibility'] = 'private'
56 # Additional properties are flattened out in the v2 API.
57 params.update(properties)
58 body = self.image_client.create_image(**params)
59 image = body['image'] if 'image' in body else body
60 self.addCleanup(self.image_client.delete_image, image['id'])
61 self.assertEqual("queued", image['status'])
62 with open(path, 'rb') as image_file:
63 if CONF.image_feature_enabled.api_v1:
64 self.image_client.update_image(image['id'], data=image_file)
65 else:
66 self.image_client.store_image_file(image['id'], image_file)
Marian Krcmarik1972c462020-11-20 01:33:02 +010067
68 if CONF.image_feature_enabled.import_image:
69 available_stores = []
70 try:
71 available_stores = self.image_client.info_stores()['stores']
Luigi Toscano4e9303e2022-06-24 11:37:34 +020072 except lib_exc.NotFound:
Marian Krcmarik1972c462020-11-20 01:33:02 +010073 pass
74 available_import_methods = self.image_client.info_import()[
75 'import-methods']['value']
76 if ('copy-image' in available_import_methods and
77 len(available_stores) > 1):
78 self.image_client.image_import(image['id'],
79 method='copy-image',
80 all_stores=True,
81 all_stores_must_succeed=False)
82 failed_stores = waiters.wait_for_image_copied_to_stores(
83 self.image_client, image['id'])
84 self.assertEqual(0, len(failed_stores),
85 "Failed to copy the following stores: %s" %
86 str(failed_stores))
87
Brianna Poulos011292a2017-03-15 16:24:38 -040088 return image['id']