blob: f09bc87b6fdc47a5a72560cd3030e4172bcac98d [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 waiters
20from tempest import config
21from tempest.lib.common.utils import data_utils
Michael Polenchuk7a6ba0b2022-09-07 10:30:53 +040022from tempest.lib.common.utils import test_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,
Ghanshyam Manne5ed4b92023-08-06 12:03:34 -070049 'visibility': 'private'
Brianna Poulos011292a2017-03-15 16:24:38 -040050 }
Ghanshyam Manne5ed4b92023-08-06 12:03:34 -070051 # Additional properties are flattened out in the v2 API.
52 params.update(properties)
Brianna Poulos011292a2017-03-15 16:24:38 -040053 body = self.image_client.create_image(**params)
54 image = body['image'] if 'image' in body else body
Michael Polenchuk7a6ba0b2022-09-07 10:30:53 +040055 self.addCleanup(self.image_client.wait_for_resource_deletion,
56 image['id'])
57 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
58 self.image_client.delete_image, image['id'])
Brianna Poulos011292a2017-03-15 16:24:38 -040059 self.assertEqual("queued", image['status'])
60 with open(path, 'rb') as image_file:
Ghanshyam Manne5ed4b92023-08-06 12:03:34 -070061 self.image_client.store_image_file(image['id'], image_file)
Marian Krcmarik1972c462020-11-20 01:33:02 +010062
63 if CONF.image_feature_enabled.import_image:
64 available_stores = []
65 try:
66 available_stores = self.image_client.info_stores()['stores']
Luigi Toscano4e9303e2022-06-24 11:37:34 +020067 except lib_exc.NotFound:
Marian Krcmarik1972c462020-11-20 01:33:02 +010068 pass
69 available_import_methods = self.image_client.info_import()[
70 'import-methods']['value']
71 if ('copy-image' in available_import_methods and
72 len(available_stores) > 1):
73 self.image_client.image_import(image['id'],
74 method='copy-image',
75 all_stores=True,
76 all_stores_must_succeed=False)
77 failed_stores = waiters.wait_for_image_copied_to_stores(
78 self.image_client, image['id'])
79 self.assertEqual(0, len(failed_stores),
80 "Failed to copy the following stores: %s" %
81 str(failed_stores))
82
Brianna Poulos011292a2017-03-15 16:24:38 -040083 return image['id']