blob: eb23e4bcdca19d87574ff6936b8a0125a0d1d240 [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
Mauro S. M. Rodrigues54110362013-02-15 13:14:04 -050016import netaddr
ivan-zhu1feeb382013-01-24 10:14:39 +080017import testtools
Jay Pipes13b479b2012-06-11 14:52:27 -040018
Sean Dague1937d092013-05-17 16:36:38 -040019from tempest.api.compute import base
Masayuki Igawa209fd502014-02-17 14:46:43 +090020from tempest.common.utils.linux import remote_client
Sean Dague86bd8422013-12-20 09:56:44 -050021from tempest import config
Ken'ichi Ohmichi757833a2017-03-10 10:30:30 -080022from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080023from tempest.lib import decorators
Masayuki Igawa209fd502014-02-17 14:46:43 +090024from tempest import test
Daryl Walleck6b9b2882012-04-08 21:43:39 -050025
Sean Dague86bd8422013-12-20 09:56:44 -050026CONF = config.CONF
27
Daryl Walleck6b9b2882012-04-08 21:43:39 -050028
ivan-zhuf2b00502013-10-18 10:06:52 +080029class ServersTestJSON(base.BaseV2ComputeTest):
ivan-zhua5141d92013-03-06 23:12:43 +080030 disk_config = 'AUTO'
Daryl Walleck6b9b2882012-04-08 21:43:39 -050031
Attila Fazekas19044d52013-02-16 07:35:06 +010032 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053033 def setup_credentials(cls):
Attila Fazekas423834d2014-03-14 17:33:13 +010034 cls.prepare_instance_network()
Rohan Kanade60b73092015-02-04 17:58:19 +053035 super(ServersTestJSON, cls).setup_credentials()
36
37 @classmethod
38 def setup_clients(cls):
39 super(ServersTestJSON, cls).setup_clients()
40 cls.client = cls.servers_client
John Warren94d8faf2015-09-15 12:22:24 -040041 cls.networks_client = cls.os.networks_client
John Warren3961acd2015-10-02 14:38:53 -040042 cls.subnets_client = cls.os.subnets_client
Rohan Kanade60b73092015-02-04 17:58:19 +053043
44 @classmethod
45 def resource_setup(cls):
nithya-ganesan222efd72015-01-22 12:20:27 +000046 cls.set_validation_resources()
Andrea Frittoli50bb80d2014-09-15 12:34:27 +010047 super(ServersTestJSON, cls).resource_setup()
Daryl Walleck6b9b2882012-04-08 21:43:39 -050048 cls.meta = {'hello': 'world'}
49 cls.accessIPv4 = '1.1.1.1'
Mauro S. M. Rodrigues54110362013-02-15 13:14:04 -050050 cls.accessIPv6 = '0000:0000:0000:0000:0000:babe:220.12.22.2'
zhuflc6ce5392016-08-17 14:34:37 +080051 cls.name = data_utils.rand_name(cls.__name__ + '-server')
Ghanshyam3390d9f2015-12-25 12:48:02 +090052 cls.password = data_utils.rand_password()
David Kranz0fb14292015-02-11 15:55:20 -050053 disk_config = cls.disk_config
zhufl7e0c9b62017-02-16 11:25:34 +080054 server_initial = cls.create_test_server(
Joseph Lanouxb3e1f872015-01-30 11:13:07 +000055 validatable=True,
56 wait_until='ACTIVE',
57 name=cls.name,
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +000058 metadata=cls.meta,
Joseph Lanouxb3e1f872015-01-30 11:13:07 +000059 accessIPv4=cls.accessIPv4,
60 accessIPv6=cls.accessIPv6,
Ghanshyam3390d9f2015-12-25 12:48:02 +090061 disk_config=disk_config,
62 adminPass=cls.password)
zhufl7e0c9b62017-02-16 11:25:34 +080063 cls.server = (cls.client.show_server(server_initial['id'])
ghanshyam0f825252015-08-25 16:02:50 +090064 ['server'])
Daryl Walleck6b9b2882012-04-08 21:43:39 -050065
Matt Riedemann778b5f92015-03-11 12:44:28 -070066 def _create_net_subnet_ret_net_from_cidr(self, cidr):
67 name_net = data_utils.rand_name(self.__class__.__name__)
John Warren94d8faf2015-09-15 12:22:24 -040068 net = self.networks_client.create_network(name=name_net)
69 self.addCleanup(self.networks_client.delete_network,
Matt Riedemann778b5f92015-03-11 12:44:28 -070070 net['network']['id'])
71
John Warren3961acd2015-10-02 14:38:53 -040072 subnet = self.subnets_client.create_subnet(
Matt Riedemann778b5f92015-03-11 12:44:28 -070073 network_id=net['network']['id'],
74 cidr=cidr,
75 ip_version=4)
John Warren3961acd2015-10-02 14:38:53 -040076 self.addCleanup(self.subnets_client.delete_subnet,
Matt Riedemann778b5f92015-03-11 12:44:28 -070077 subnet['subnet']['id'])
78 return net
79
Masayuki Igawa209fd502014-02-17 14:46:43 +090080 @test.attr(type='smoke')
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080081 @decorators.idempotent_id('5de47127-9977-400a-936f-abcfbec1218f')
Daryl Wallecked97dca2012-07-04 23:25:45 -050082 def test_verify_server_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050083 # Verify the specified server attributes are set correctly
Daryl Walleck6b9b2882012-04-08 21:43:39 -050084 self.assertEqual(self.accessIPv4, self.server['accessIPv4'])
Mauro S. M. Rodrigues54110362013-02-15 13:14:04 -050085 # NOTE(maurosr): See http://tools.ietf.org/html/rfc5952 (section 4)
86 # Here we compare directly with the canonicalized format.
87 self.assertEqual(self.server['accessIPv6'],
88 str(netaddr.IPAddress(self.accessIPv6)))
Daryl Walleck6b9b2882012-04-08 21:43:39 -050089 self.assertEqual(self.name, self.server['name'])
90 self.assertEqual(self.image_ref, self.server['image']['id'])
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090091 self.assertEqual(self.flavor_ref, self.server['flavor']['id'])
Daryl Walleck6b9b2882012-04-08 21:43:39 -050092 self.assertEqual(self.meta, self.server['metadata'])
93
Masayuki Igawa209fd502014-02-17 14:46:43 +090094 @test.attr(type='smoke')
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080095 @decorators.idempotent_id('9a438d88-10c6-4bcd-8b5b-5b6e25e1346f')
Daryl Wallecked97dca2012-07-04 23:25:45 -050096 def test_list_servers(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050097 # The created server should be in the list of all servers
David Kranzae99b9a2015-02-16 13:37:01 -050098 body = self.client.list_servers()
Daryl Wallecked97dca2012-07-04 23:25:45 -050099 servers = body['servers']
100 found = any([i for i in servers if i['id'] == self.server['id']])
101 self.assertTrue(found)
102
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800103 @decorators.idempotent_id('585e934c-448e-43c4-acbf-d06a9b899997')
Daryl Wallecked97dca2012-07-04 23:25:45 -0500104 def test_list_servers_with_detail(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500105 # The created server should be in the detailed list of all servers
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +0000106 body = self.client.list_servers(detail=True)
Daryl Wallecked97dca2012-07-04 23:25:45 -0500107 servers = body['servers']
108 found = any([i for i in servers if i['id'] == self.server['id']])
109 self.assertTrue(found)
110
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800111 @decorators.idempotent_id('cbc0f52f-05aa-492b-bdc1-84b575ca294b')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400112 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700113 'Instance validation tests are disabled.')
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500114 def test_verify_created_server_vcpus(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500115 # Verify that the number of vcpus reported by the instance matches
116 # the amount stated by the flavor
ghanshyam19973be2015-08-18 15:46:42 +0900117 flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000118 linux_client = remote_client.RemoteClient(
119 self.get_server_ip(self.server),
120 self.ssh_user,
121 self.password,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500122 self.validation_resources['keypair']['private_key'],
123 server=self.server,
124 servers_client=self.client)
Ken'ichi Ohmichi326a6b32017-03-01 14:35:30 -0800125 output = linux_client.exec_command('grep -c ^processor /proc/cpuinfo')
126 self.assertEqual(flavor['vcpus'], int(output))
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500127
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800128 @decorators.idempotent_id('ac1ad47f-984b-4441-9274-c9079b7a0666')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400129 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700130 'Instance validation tests are disabled.')
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500131 def test_host_name_is_same_as_server_name(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500132 # Verify the instance host name is the same as the server name
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000133 linux_client = remote_client.RemoteClient(
134 self.get_server_ip(self.server),
135 self.ssh_user,
136 self.password,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500137 self.validation_resources['keypair']['private_key'],
138 server=self.server,
139 servers_client=self.client)
Ken'ichi Ohmichi326a6b32017-03-01 14:35:30 -0800140 hostname = linux_client.exec_command("hostname").rstrip()
imran malikcdf20382016-06-16 00:43:57 -0700141 msg = ('Failed while verifying servername equals hostname. Expected '
142 'hostname "%s" but got "%s".' % (self.name, hostname))
obutenko149feaf2016-08-31 16:14:45 +0300143 self.assertEqual(self.name.lower(), hostname, msg)
Dan Smith4307f992012-08-16 09:23:20 -0700144
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800145 @decorators.idempotent_id('ed20d3fb-9d1f-4329-b160-543fbd5d9811')
zhufl70f3c772016-10-27 11:52:33 +0800146 @testtools.skipUnless(
147 test.is_scheduler_filter_enabled("ServerGroupAffinityFilter"),
148 'ServerGroupAffinityFilter is not available.')
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900149 def test_create_server_with_scheduler_hint_group(self):
150 # Create a server with the scheduler hint "group".
zhuflb556d252016-10-24 12:15:56 +0800151 group_id = self.create_test_server_group()['id']
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900152 hints = {'group': group_id}
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000153 server = self.create_test_server(scheduler_hints=hints,
David Kranz0fb14292015-02-11 15:55:20 -0500154 wait_until='ACTIVE')
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900155
156 # Check a server is in the group
Ken'ichi Ohmichicd111872015-11-16 06:01:11 +0000157 server_group = (self.server_groups_client.show_server_group(group_id)
ghanshyam2dc13452015-08-24 17:39:25 +0900158 ['server_group'])
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900159 self.assertIn(server['id'], server_group['members'])
160
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800161 @decorators.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2')
Joseph Lanoux38edc052014-09-18 14:25:46 +0000162 @testtools.skipUnless(CONF.service_available.neutron,
163 'Neutron service must be available.')
164 def test_verify_multiple_nics_order(self):
165 # Verify that the networks order given at the server creation is
166 # preserved within the server.
Matt Riedemann778b5f92015-03-11 12:44:28 -0700167 net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
168 net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
Joseph Lanoux38edc052014-09-18 14:25:46 +0000169
170 networks = [{'uuid': net1['network']['id']},
171 {'uuid': net2['network']['id']}]
172
David Kranz0fb14292015-02-11 15:55:20 -0500173 server_multi_nics = self.create_test_server(
Joseph Lanoux38edc052014-09-18 14:25:46 +0000174 networks=networks, wait_until='ACTIVE')
175
Joseph Lanouxe59f0ff2014-10-17 14:56:56 +0000176 # Cleanup server; this is needed in the test case because with the LIFO
177 # nature of the cleanups, if we don't delete the server first, the port
178 # will still be part of the subnet and we'll get a 409 from Neutron
179 # when trying to delete the subnet. The tear down in the base class
180 # will try to delete the server and get a 404 but it's ignored so
181 # we're OK.
zhuflf08e28b2016-12-14 17:29:50 +0800182 self.addCleanup(self.delete_server, server_multi_nics['id'])
Joseph Lanouxe59f0ff2014-10-17 14:56:56 +0000183
ghanshyam0f825252015-08-25 16:02:50 +0900184 addresses = (self.client.list_addresses(server_multi_nics['id'])
185 ['addresses'])
Joseph Lanoux38edc052014-09-18 14:25:46 +0000186
venkata anilbd2d49a2015-01-16 08:07:15 +0000187 # We can't predict the ip addresses assigned to the server on networks.
188 # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at
189 # other times ['19.80.0.3', '19.86.0.3']. So we check if the first
190 # address is in first network, similarly second address is in second
191 # network.
Matt Riedemann778b5f92015-03-11 12:44:28 -0700192 addr = [addresses[net1['network']['name']][0]['addr'],
193 addresses[net2['network']['name']][0]['addr']]
venkata anilbd2d49a2015-01-16 08:07:15 +0000194 networks = [netaddr.IPNetwork('19.80.0.0/24'),
195 netaddr.IPNetwork('19.86.0.0/24')]
196 for address, network in zip(addr, networks):
197 self.assertIn(address, network)
Joseph Lanoux38edc052014-09-18 14:25:46 +0000198
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800199 @decorators.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2')
Matt Riedemann778b5f92015-03-11 12:44:28 -0700200 @testtools.skipUnless(CONF.service_available.neutron,
201 'Neutron service must be available.')
Matt Riedemann778b5f92015-03-11 12:44:28 -0700202 def test_verify_duplicate_network_nics(self):
203 # Verify that server creation does not fail when more than one nic
204 # is created on the same network.
205 net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
206 net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
207
208 networks = [{'uuid': net1['network']['id']},
209 {'uuid': net2['network']['id']},
210 {'uuid': net1['network']['id']}]
211
212 server_multi_nics = self.create_test_server(
213 networks=networks, wait_until='ACTIVE')
zhuflf08e28b2016-12-14 17:29:50 +0800214 self.addCleanup(self.delete_server, server_multi_nics['id'])
Matt Riedemann778b5f92015-03-11 12:44:28 -0700215
ghanshyam0f825252015-08-25 16:02:50 +0900216 addresses = (self.client.list_addresses(server_multi_nics['id'])
217 ['addresses'])
Matt Riedemann778b5f92015-03-11 12:44:28 -0700218
219 addr = [addresses[net1['network']['name']][0]['addr'],
220 addresses[net2['network']['name']][0]['addr'],
221 addresses[net1['network']['name']][1]['addr']]
222 networks = [netaddr.IPNetwork('19.80.0.0/24'),
223 netaddr.IPNetwork('19.86.0.0/24'),
224 netaddr.IPNetwork('19.80.0.0/24')]
225 for address, network in zip(addr, networks):
226 self.assertIn(address, network)
227
Dan Smith4307f992012-08-16 09:23:20 -0700228
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800229class ServersWithSpecificFlavorTestJSON(base.BaseV2ComputeAdminTest):
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800230 disk_config = 'AUTO'
231
232 @classmethod
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000233 def setup_credentials(cls):
Attila Fazekas423834d2014-03-14 17:33:13 +0100234 cls.prepare_instance_network()
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000235 super(ServersWithSpecificFlavorTestJSON, cls).setup_credentials()
236
237 @classmethod
238 def setup_clients(cls):
Rohan Kanade60b73092015-02-04 17:58:19 +0530239 super(ServersWithSpecificFlavorTestJSON, cls).setup_clients()
Attila Fazekas076f79f2014-03-14 17:43:46 +0100240 cls.client = cls.servers_client
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800241
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000242 @classmethod
243 def resource_setup(cls):
244 cls.set_validation_resources()
245
246 super(ServersWithSpecificFlavorTestJSON, cls).resource_setup()
247
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800248 @decorators.idempotent_id('b3c7bcfc-bb5b-4e22-b517-c7f686b802ca')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400249 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700250 'Instance validation tests are disabled.')
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800251 def test_verify_created_server_ephemeral_disk(self):
252 # Verify that the ephemeral disk is created when creating server
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000253 flavor_base = self.flavors_client.show_flavor(
254 self.flavor_ref)['flavor']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800255
zhufl25f5ca52016-10-24 16:06:08 +0800256 def create_flavor_with_ephemeral(ephem_disk):
zhufl0df80762016-12-15 10:15:40 +0800257 name = 'flavor_with_ephemeral_%s' % ephem_disk
258 flavor_name = data_utils.rand_name(name)
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000259
260 ram = flavor_base['ram']
261 vcpus = flavor_base['vcpus']
262 disk = flavor_base['disk']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800263
zhufl0df80762016-12-15 10:15:40 +0800264 # Create a flavor with ephemeral disk
zhufl94cb0542017-02-13 17:51:47 +0800265 flavor = self.create_flavor(name=flavor_name, ram=ram, vcpus=vcpus,
266 disk=disk, ephemeral=ephem_disk)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800267 return flavor['id']
268
zhufl25f5ca52016-10-24 16:06:08 +0800269 flavor_with_eph_disk_id = create_flavor_with_ephemeral(ephem_disk=1)
270 flavor_no_eph_disk_id = create_flavor_with_ephemeral(ephem_disk=0)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800271
272 admin_pass = self.image_ssh_password
273
Ken'ichi Ohmichie1dc9912015-08-27 09:06:26 +0000274 server_no_eph_disk = self.create_test_server(
275 validatable=True,
276 wait_until='ACTIVE',
277 adminPass=admin_pass,
278 flavor=flavor_no_eph_disk_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000279
zhufl25f5ca52016-10-24 16:06:08 +0800280 # Get partition number of server without ephemeral disk.
Ken'ichi Ohmichi76800242015-07-03 05:12:31 +0000281 server_no_eph_disk = self.client.show_server(
ghanshyam0f825252015-08-25 16:02:50 +0900282 server_no_eph_disk['id'])['server']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000283 linux_client = remote_client.RemoteClient(
284 self.get_server_ip(server_no_eph_disk),
285 self.ssh_user,
286 admin_pass,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500287 self.validation_resources['keypair']['private_key'],
288 server=server_no_eph_disk,
289 servers_client=self.client)
Evgeny Antyshev4894a912016-11-21 12:17:18 +0000290 disks_num = len(linux_client.get_disks().split('\n'))
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800291
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000292 # Explicit server deletion necessary for Juno compatibility
293 self.client.delete_server(server_no_eph_disk['id'])
294
Ken'ichi Ohmichie1dc9912015-08-27 09:06:26 +0000295 server_with_eph_disk = self.create_test_server(
296 validatable=True,
297 wait_until='ACTIVE',
298 adminPass=admin_pass,
299 flavor=flavor_with_eph_disk_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000300
Ken'ichi Ohmichi76800242015-07-03 05:12:31 +0000301 server_with_eph_disk = self.client.show_server(
ghanshyam0f825252015-08-25 16:02:50 +0900302 server_with_eph_disk['id'])['server']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000303 linux_client = remote_client.RemoteClient(
304 self.get_server_ip(server_with_eph_disk),
305 self.ssh_user,
306 admin_pass,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500307 self.validation_resources['keypair']['private_key'],
308 server=server_with_eph_disk,
309 servers_client=self.client)
Evgeny Antyshev4894a912016-11-21 12:17:18 +0000310 disks_num_eph = len(linux_client.get_disks().split('\n'))
311 self.assertEqual(disks_num + 1, disks_num_eph)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800312
313
Attila Fazekas19044d52013-02-16 07:35:06 +0100314class ServersTestManualDisk(ServersTestJSON):
315 disk_config = 'MANUAL'
316
Daryl Walleck0aea0032012-12-04 00:53:28 -0600317 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +0530318 def skip_checks(cls):
319 super(ServersTestManualDisk, cls).skip_checks()
Sean Dague86bd8422013-12-20 09:56:44 -0500320 if not CONF.compute_feature_enabled.disk_config:
Daryl Walleck0aea0032012-12-04 00:53:28 -0600321 msg = "DiskConfig extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +0800322 raise cls.skipException(msg)