blob: 2321b4ee6bb87e8275042ae7720ee43d8843bd1e [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipes13b479b2012-06-11 14:52:27 -04002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
David Kranzcf0040c2012-06-26 09:46:56 -040016import time
Jay Pipesf38eaac2012-06-21 13:37:35 -040017
Doug Hellmann583ce2c2015-03-11 14:55:46 +000018from oslo_log import log as logging
Matthew Treinish01472ff2015-02-20 17:26:52 -050019from tempest_lib import exceptions as lib_exc
20
Ken'ichi Ohmichi4d237e72015-11-05 06:32:33 +000021from tempest.common import api_version_utils
Joseph Lanouxb3e1f872015-01-30 11:13:07 +000022from tempest.common import compute
Fei Long Wangd39431f2015-05-14 11:30:48 +120023from tempest.common.utils import data_utils
Ken'ichi Ohmichi8b9c7802015-07-08 05:57:37 +000024from tempest.common import waiters
Matthew Treinishb0a78fc2014-01-29 16:49:12 +000025from tempest import config
Attila Fazekasdc216422013-01-29 15:12:14 +010026import tempest.test
Jay Pipesf38eaac2012-06-21 13:37:35 -040027
Matthew Treinishb0a78fc2014-01-29 16:49:12 +000028CONF = config.CONF
Tiago Melloeda03b52012-08-22 23:47:29 -030029
Jay Pipesf38eaac2012-06-21 13:37:35 -040030LOG = logging.getLogger(__name__)
Daryl Walleckc7251962012-03-12 17:26:54 -050031
32
Ken'ichi Ohmichi4d237e72015-11-05 06:32:33 +000033class BaseV2ComputeTest(api_version_utils.BaseMicroversionTest,
34 tempest.test.BaseTestCase):
Sean Daguef237ccb2013-01-04 15:19:14 -050035 """Base test case class for all Compute API tests."""
Daryl Walleckc7251962012-03-12 17:26:54 -050036
Attila Fazekas430dae32013-10-17 15:19:32 +020037 force_tenant_isolation = False
Chris Yeoh8a79b9d2013-01-18 19:32:47 +103038
Andrea Frittolib21de6c2015-02-06 20:12:38 +000039 # TODO(andreaf) We should care also for the alt_manager here
40 # but only once client lazy load in the manager is done
41 credentials = ['primary']
42
Jay Pipesf38eaac2012-06-21 13:37:35 -040043 @classmethod
Emily Hugenbruche7991d92014-12-12 16:53:36 +000044 def skip_checks(cls):
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +000045 super(BaseV2ComputeTest, cls).skip_checks()
Matthew Treinishf8ff3582015-08-25 12:41:56 -040046 if not CONF.service_available.nova:
47 raise cls.skipException("Nova is not available")
Ken'ichi Ohmichi4d237e72015-11-05 06:32:33 +000048 cfg_min_version = CONF.compute_feature_enabled.min_microversion
49 cfg_max_version = CONF.compute_feature_enabled.max_microversion
50 api_version_utils.check_skip_with_microversion(cls.min_microversion,
51 cls.max_microversion,
52 cfg_min_version,
53 cfg_max_version)
Jay Pipesf38eaac2012-06-21 13:37:35 -040054
Emily Hugenbruche7991d92014-12-12 16:53:36 +000055 @classmethod
56 def setup_credentials(cls):
57 cls.set_network_resources()
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +000058 super(BaseV2ComputeTest, cls).setup_credentials()
Daryl Walleckc7251962012-03-12 17:26:54 -050059
Emily Hugenbruche7991d92014-12-12 16:53:36 +000060 @classmethod
61 def setup_clients(cls):
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +000062 super(BaseV2ComputeTest, cls).setup_clients()
Emily Hugenbruche7991d92014-12-12 16:53:36 +000063 cls.servers_client = cls.os.servers_client
Ken'ichi Ohmichi7ca54b82015-07-07 01:10:26 +000064 cls.server_groups_client = cls.os.server_groups_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000065 cls.flavors_client = cls.os.flavors_client
66 cls.images_client = cls.os.images_client
67 cls.extensions_client = cls.os.extensions_client
Ken'ichi Ohmichi03af1c52015-07-13 00:28:05 +000068 cls.floating_ip_pools_client = cls.os.floating_ip_pools_client
John Warrene74890a2015-11-11 15:18:01 -050069 cls.floating_ips_client = cls.os.compute_floating_ips_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000070 cls.keypairs_client = cls.os.keypairs_client
Ken'ichi Ohmichi685cd172015-07-13 01:29:57 +000071 cls.security_group_rules_client = cls.os.security_group_rules_client
John Warrenf2345512015-12-10 13:39:30 -050072 cls.security_groups_client = cls.os.compute_security_groups_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000073 cls.quotas_client = cls.os.quotas_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000074 cls.quota_classes_client = cls.os.quota_classes_client
John Warren9487a182015-09-14 18:12:56 -040075 cls.compute_networks_client = cls.os.compute_networks_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000076 cls.limits_client = cls.os.limits_client
77 cls.volumes_extensions_client = cls.os.volumes_extensions_client
Gaozexub9c9d6e2015-09-10 17:08:04 +080078 cls.snapshots_extensions_client = cls.os.snapshots_extensions_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000079 cls.interfaces_client = cls.os.interfaces_client
80 cls.fixed_ips_client = cls.os.fixed_ips_client
81 cls.availability_zone_client = cls.os.availability_zone_client
82 cls.agents_client = cls.os.agents_client
83 cls.aggregates_client = cls.os.aggregates_client
84 cls.services_client = cls.os.services_client
85 cls.instance_usages_audit_log_client = (
86 cls.os.instance_usages_audit_log_client)
87 cls.hypervisor_client = cls.os.hypervisor_client
88 cls.certificates_client = cls.os.certificates_client
89 cls.migrations_client = cls.os.migrations_client
90 cls.security_group_default_rules_client = (
91 cls.os.security_group_default_rules_client)
Ken'ichi Ohmichi2b6012b2015-09-03 01:56:19 +000092 cls.versions_client = cls.os.compute_versions_client
Emily Hugenbruche7991d92014-12-12 16:53:36 +000093
Ivan Kolodyazhnybcfc32e2015-08-06 13:31:36 +030094 if CONF.volume_feature_enabled.api_v1:
95 cls.volumes_client = cls.os.volumes_client
96 else:
97 cls.volumes_client = cls.os.volumes_v2_client
98
Emily Hugenbruche7991d92014-12-12 16:53:36 +000099 @classmethod
100 def resource_setup(cls):
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +0000101 super(BaseV2ComputeTest, cls).resource_setup()
Matthew Treinishb0a78fc2014-01-29 16:49:12 +0000102 cls.build_interval = CONF.compute.build_interval
103 cls.build_timeout = CONF.compute.build_timeout
104 cls.ssh_user = CONF.compute.ssh_user
105 cls.image_ref = CONF.compute.image_ref
106 cls.image_ref_alt = CONF.compute.image_ref_alt
107 cls.flavor_ref = CONF.compute.flavor_ref
108 cls.flavor_ref_alt = CONF.compute.flavor_ref_alt
109 cls.image_ssh_user = CONF.compute.image_ssh_user
110 cls.image_ssh_password = CONF.compute.image_ssh_password
Jay Pipesf38eaac2012-06-21 13:37:35 -0400111 cls.servers = []
Sean Dagued62bf1c2013-06-05 14:36:25 -0400112 cls.images = []
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800113 cls.security_groups = []
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530114 cls.server_groups = []
Matthew Treinishf7fca6a2013-12-09 16:27:23 +0000115
Emily Hugenbruche7991d92014-12-12 16:53:36 +0000116 @classmethod
117 def resource_cleanup(cls):
118 cls.clear_images()
119 cls.clear_servers()
120 cls.clear_security_groups()
121 cls.clear_server_groups()
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +0000122 super(BaseV2ComputeTest, cls).resource_cleanup()
Ken'ichi Ohmichi543a5d42014-05-02 08:44:15 +0900123
Matthew Treinishf7fca6a2013-12-09 16:27:23 +0000124 @classmethod
Jay Pipes444c3e62012-10-04 19:26:35 -0400125 def clear_servers(cls):
Salvatore1422a9a2014-10-08 15:53:25 +0200126 LOG.debug('Clearing servers: %s', ','.join(
127 server['id'] for server in cls.servers))
Jay Pipes444c3e62012-10-04 19:26:35 -0400128 for server in cls.servers:
Dan Smith74e7bcb2012-08-21 09:18:26 -0700129 try:
130 cls.servers_client.delete_server(server['id'])
Masayuki Igawabfa07602015-01-20 18:47:17 +0900131 except lib_exc.NotFound:
Joe Gordon0c335792014-09-23 12:36:11 -0700132 # Something else already cleaned up the server, nothing to be
133 # worried about
Dan Smith74e7bcb2012-08-21 09:18:26 -0700134 pass
Joe Gordon0c335792014-09-23 12:36:11 -0700135 except Exception:
136 LOG.exception('Deleting server %s failed' % server['id'])
Dan Smith74e7bcb2012-08-21 09:18:26 -0700137
Jay Pipes444c3e62012-10-04 19:26:35 -0400138 for server in cls.servers:
Dan Smith74e7bcb2012-08-21 09:18:26 -0700139 try:
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +0000140 waiters.wait_for_server_termination(cls.servers_client,
141 server['id'])
Dan Smith74e7bcb2012-08-21 09:18:26 -0700142 except Exception:
Joe Gordon0c335792014-09-23 12:36:11 -0700143 LOG.exception('Waiting for deletion of server %s failed'
144 % server['id'])
Dan Smith74e7bcb2012-08-21 09:18:26 -0700145
146 @classmethod
Attila Fazekas305e65b2013-10-29 13:23:07 +0100147 def server_check_teardown(cls):
148 """Checks is the shared server clean enough for subsequent test.
Ken'ichi Ohmichi88363cb2015-11-19 08:00:54 +0000149
Attila Fazekas305e65b2013-10-29 13:23:07 +0100150 Method will delete the server when it's dirty.
151 The setUp method is responsible for creating a new server.
152 Exceptions raised in tearDown class are fails the test case,
Marian Horban6afb0232015-11-10 22:47:12 -0500153 This method supposed to use only by tearDown methods, when
Attila Fazekas305e65b2013-10-29 13:23:07 +0100154 the shared server_id is stored in the server_id of the class.
155 """
156 if getattr(cls, 'server_id', None) is not None:
157 try:
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000158 waiters.wait_for_server_status(cls.servers_client,
159 cls.server_id, 'ACTIVE')
Attila Fazekas305e65b2013-10-29 13:23:07 +0100160 except Exception as exc:
161 LOG.exception(exc)
162 cls.servers_client.delete_server(cls.server_id)
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +0000163 waiters.wait_for_server_termination(cls.servers_client,
164 cls.server_id)
Attila Fazekas305e65b2013-10-29 13:23:07 +0100165 cls.server_id = None
166 raise
167
168 @classmethod
Sean Dagued62bf1c2013-06-05 14:36:25 -0400169 def clear_images(cls):
Salvatore1422a9a2014-10-08 15:53:25 +0200170 LOG.debug('Clearing images: %s', ','.join(cls.images))
Sean Dagued62bf1c2013-06-05 14:36:25 -0400171 for image_id in cls.images:
172 try:
173 cls.images_client.delete_image(image_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900174 except lib_exc.NotFound:
David Kranz33138312013-09-24 17:09:32 -0400175 # The image may have already been deleted which is OK.
176 pass
Yair Frieda039f872014-01-02 12:11:10 +0200177 except Exception:
178 LOG.exception('Exception raised deleting image %s' % image_id)
Sean Dagued62bf1c2013-06-05 14:36:25 -0400179
180 @classmethod
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800181 def clear_security_groups(cls):
Salvatore1422a9a2014-10-08 15:53:25 +0200182 LOG.debug('Clearing security groups: %s', ','.join(
183 str(sg['id']) for sg in cls.security_groups))
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800184 for sg in cls.security_groups:
185 try:
David Kranz9964b4e2015-02-06 15:45:29 -0500186 cls.security_groups_client.delete_security_group(sg['id'])
Masayuki Igawabfa07602015-01-20 18:47:17 +0900187 except lib_exc.NotFound:
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800188 # The security group may have already been deleted which is OK.
189 pass
190 except Exception as exc:
191 LOG.info('Exception raised deleting security group %s',
192 sg['id'])
193 LOG.exception(exc)
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800194
195 @classmethod
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530196 def clear_server_groups(cls):
Salvatore1422a9a2014-10-08 15:53:25 +0200197 LOG.debug('Clearing server groups: %s', ','.join(cls.server_groups))
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530198 for server_group_id in cls.server_groups:
199 try:
Ken'ichi Ohmichi7ca54b82015-07-07 01:10:26 +0000200 cls.server_groups_client.delete_server_group(server_group_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900201 except lib_exc.NotFound:
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530202 # The server-group may have already been deleted which is OK.
203 pass
204 except Exception:
205 LOG.exception('Exception raised deleting server-group %s',
206 server_group_id)
207
208 @classmethod
Joe Gordon8843f0f2015-03-17 15:07:34 -0700209 def create_test_server(cls, validatable=False, volume_backed=False,
210 **kwargs):
Joseph Lanouxb3e1f872015-01-30 11:13:07 +0000211 """Wrapper utility that returns a test server.
Rohit Karajgidc300b22012-05-04 08:11:00 -0700212
Joseph Lanouxb3e1f872015-01-30 11:13:07 +0000213 This wrapper utility calls the common create test server and
214 returns a test server. The purpose of this wrapper is to minimize
215 the impact on the code of the tests already using this
216 function.
Joe Gordon8843f0f2015-03-17 15:07:34 -0700217
218 :param validatable: Whether the server will be pingable or sshable.
219 :param volume_backed: Whether the instance is volume backed or not.
Joseph Lanouxb3e1f872015-01-30 11:13:07 +0000220 """
221 tenant_network = cls.get_tenant_network()
222 body, servers = compute.create_test_server(
223 cls.os,
224 validatable,
225 validation_resources=cls.validation_resources,
226 tenant_network=tenant_network,
Joe Gordon8843f0f2015-03-17 15:07:34 -0700227 volume_backed=volume_backed,
Joseph Lanouxb3e1f872015-01-30 11:13:07 +0000228 **kwargs)
Ken'ichi Ohmichi51c8c262013-12-21 03:30:37 +0900229
230 cls.servers.extend(servers)
Sean Dague9b669e32012-12-13 18:40:08 -0500231
David Kranz0fb14292015-02-11 15:55:20 -0500232 return body
Sean Dague9b669e32012-12-13 18:40:08 -0500233
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800234 @classmethod
235 def create_security_group(cls, name=None, description=None):
236 if name is None:
237 name = data_utils.rand_name(cls.__name__ + "-securitygroup")
238 if description is None:
Ken'ichi Ohmichi4937f562015-03-23 00:15:01 +0000239 description = data_utils.rand_name('description')
ghanshyamb610b772015-08-24 17:29:38 +0900240 body = cls.security_groups_client.create_security_group(
241 name=name, description=description)['security_group']
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800242 cls.security_groups.append(body)
243
David Kranz9964b4e2015-02-06 15:45:29 -0500244 return body
Zhi Kun Liu02e7a7b2014-01-08 16:08:32 +0800245
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530246 @classmethod
Ghanshyam2a180b82014-06-16 13:54:22 +0900247 def create_test_server_group(cls, name="", policy=None):
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530248 if not name:
249 name = data_utils.rand_name(cls.__name__ + "-Server-Group")
Ghanshyam2a180b82014-06-16 13:54:22 +0900250 if policy is None:
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530251 policy = ['affinity']
Ken'ichi Ohmichi1f36daa2015-09-30 01:41:34 +0000252 body = cls.server_groups_client.create_server_group(
253 name=name, policies=policy)['server_group']
David Kranzda5d4ec2014-06-24 16:04:57 -0400254 cls.server_groups.append(body['id'])
David Kranzae99b9a2015-02-16 13:37:01 -0500255 return body
Abhijeet.Jain87dd4452014-04-23 15:51:23 +0530256
David Kranzcf0040c2012-06-26 09:46:56 -0400257 def wait_for(self, condition):
Sean Daguef237ccb2013-01-04 15:19:14 -0500258 """Repeatedly calls condition() until a timeout."""
David Kranzcf0040c2012-06-26 09:46:56 -0400259 start_time = int(time.time())
260 while True:
261 try:
262 condition()
Matthew Treinish05d9fb92012-12-07 16:14:05 -0500263 except Exception:
David Kranzcf0040c2012-06-26 09:46:56 -0400264 pass
265 else:
266 return
267 if int(time.time()) - start_time >= self.build_timeout:
268 condition()
269 return
270 time.sleep(self.build_interval)
Jay Pipesf38eaac2012-06-21 13:37:35 -0400271
Matt Riedemann807d0562014-01-27 12:03:10 -0800272 @staticmethod
273 def _delete_volume(volumes_client, volume_id):
274 """Deletes the given volume and waits for it to be gone."""
275 try:
Joseph Lanoux6809bab2014-12-18 14:57:18 +0000276 volumes_client.delete_volume(volume_id)
Matt Riedemann807d0562014-01-27 12:03:10 -0800277 # TODO(mriedem): We should move the wait_for_resource_deletion
278 # into the delete_volume method as a convenience to the caller.
279 volumes_client.wait_for_resource_deletion(volume_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900280 except lib_exc.NotFound:
Matt Riedemann807d0562014-01-27 12:03:10 -0800281 LOG.warn("Unable to delete volume '%s' since it was not found. "
282 "Maybe it was already deleted?" % volume_id)
283
Attila Fazekas423834d2014-03-14 17:33:13 +0100284 @classmethod
285 def prepare_instance_network(cls):
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000286 if (CONF.validation.auth_method != 'disabled' and
287 CONF.validation.connect_method == 'floating'):
Attila Fazekas423834d2014-03-14 17:33:13 +0100288 cls.set_network_resources(network=True, subnet=True, router=True,
289 dhcp=True)
290
ivan-zhu8f992be2013-07-31 14:56:58 +0800291 @classmethod
292 def create_image_from_server(cls, server_id, **kwargs):
293 """Wrapper utility that returns an image created from the server."""
Masayuki Igawa259c1132013-10-31 17:48:44 +0900294 name = data_utils.rand_name(cls.__name__ + "-image")
ivan-zhu8f992be2013-07-31 14:56:58 +0800295 if 'name' in kwargs:
296 name = kwargs.pop('name')
297
Ken'ichi Ohmichi28f18672015-07-17 10:00:38 +0000298 image = cls.images_client.create_image(server_id, name=name)
David Kranza5299eb2015-01-15 17:24:05 -0500299 image_id = data_utils.parse_image_id(image.response['location'])
ivan-zhu8f992be2013-07-31 14:56:58 +0800300 cls.images.append(image_id)
301
302 if 'wait_until' in kwargs:
Ken'ichi Ohmichi8b9c7802015-07-08 05:57:37 +0000303 waiters.wait_for_image_status(cls.images_client,
304 image_id, kwargs['wait_until'])
ghanshyam1756e0b2015-08-18 19:19:05 +0900305 image = cls.images_client.show_image(image_id)['image']
ivan-zhu8f992be2013-07-31 14:56:58 +0800306
Bob Ball621e4602013-12-06 19:53:43 +0000307 if kwargs['wait_until'] == 'ACTIVE':
308 if kwargs.get('wait_for_server', True):
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000309 waiters.wait_for_server_status(cls.servers_client,
310 server_id, 'ACTIVE')
David Kranza5299eb2015-01-15 17:24:05 -0500311 return image
ivan-zhu8f992be2013-07-31 14:56:58 +0800312
313 @classmethod
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000314 def rebuild_server(cls, server_id, validatable=False, **kwargs):
ivan-zhu8f992be2013-07-31 14:56:58 +0800315 # Destroy an existing server and creates a new one
Matthew Treinish2cd19a42013-12-02 21:54:42 +0000316 if server_id:
317 try:
318 cls.servers_client.delete_server(server_id)
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +0000319 waiters.wait_for_server_termination(cls.servers_client,
320 server_id)
Yair Frieda039f872014-01-02 12:11:10 +0200321 except Exception:
322 LOG.exception('Failed to delete server %s' % server_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000323
324 server = cls.create_test_server(
325 validatable,
326 wait_until='ACTIVE',
327 **kwargs)
Ken'ichi Ohmichi9f5adf82014-12-12 04:01:32 +0000328 cls.password = server['adminPass']
Matthew Treinish2cd19a42013-12-02 21:54:42 +0000329 return server['id']
ivan-zhu8f992be2013-07-31 14:56:58 +0800330
Matt Riedemann5dc594c2014-01-27 11:40:28 -0800331 @classmethod
Jesse Keating613b4982015-05-04 15:05:19 -0700332 def delete_server(cls, server_id):
333 """Deletes an existing server and waits for it to be gone."""
334 try:
335 cls.servers_client.delete_server(server_id)
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +0000336 waiters.wait_for_server_termination(cls.servers_client,
337 server_id)
Jesse Keating613b4982015-05-04 15:05:19 -0700338 except Exception:
339 LOG.exception('Failed to delete server %s' % server_id)
340
341 @classmethod
Matt Riedemann5dc594c2014-01-27 11:40:28 -0800342 def delete_volume(cls, volume_id):
343 """Deletes the given volume and waits for it to be gone."""
Ken'ichi Ohmichi9f5adf82014-12-12 04:01:32 +0000344 cls._delete_volume(cls.volumes_extensions_client, volume_id)
Ken'ichi Ohmichi543a5d42014-05-02 08:44:15 +0900345
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000346 @classmethod
347 def get_server_ip(cls, server):
348 """Get the server fixed or floating IP.
349
350 For the floating IP, the address created by the validation resources
351 is returned.
352 For the fixed IP, the server is returned and the current mechanism of
353 address extraction in the remote_client is followed.
354 """
355 if CONF.validation.connect_method == 'floating':
356 ip_or_server = cls.validation_resources['floating_ip']['ip']
357 elif CONF.validation.connect_method == 'fixed':
358 ip_or_server = server
359 return ip_or_server
360
Ken'ichi Ohmichi543a5d42014-05-02 08:44:15 +0900361
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +0000362class BaseV2ComputeAdminTest(BaseV2ComputeTest):
Ken'ichi Ohmichibcefa3d2014-05-09 08:14:05 +0900363 """Base test case class for Compute Admin API tests."""
ivan-zhuf2b00502013-10-18 10:06:52 +0800364
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000365 credentials = ['primary', 'admin']
Emily Hugenbruche7991d92014-12-12 16:53:36 +0000366
367 @classmethod
368 def setup_clients(cls):
Ken'ichi Ohmichi02a8ccd2015-11-05 06:05:29 +0000369 super(BaseV2ComputeAdminTest, cls).setup_clients()
Ken'ichi Ohmichi9f5adf82014-12-12 04:01:32 +0000370 cls.availability_zone_admin_client = (
371 cls.os_adm.availability_zone_client)