blob: d2e31ad45b39b0867f233cd8b27c4b03f79eeaee [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
Fei Long Wangd39431f2015-05-14 11:30:48 +120020from tempest.common.utils import data_utils
Masayuki Igawa209fd502014-02-17 14:46:43 +090021from tempest.common.utils.linux import remote_client
Sean Dague86bd8422013-12-20 09:56:44 -050022from tempest import config
Masayuki Igawa209fd502014-02-17 14:46:43 +090023from tempest import test
Daryl Walleck6b9b2882012-04-08 21:43:39 -050024
Sean Dague86bd8422013-12-20 09:56:44 -050025CONF = config.CONF
26
Daryl Walleck6b9b2882012-04-08 21:43:39 -050027
ivan-zhuf2b00502013-10-18 10:06:52 +080028class ServersTestJSON(base.BaseV2ComputeTest):
ivan-zhua5141d92013-03-06 23:12:43 +080029 disk_config = 'AUTO'
Daryl Walleck6b9b2882012-04-08 21:43:39 -050030
Attila Fazekas19044d52013-02-16 07:35:06 +010031 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053032 def setup_credentials(cls):
Attila Fazekas423834d2014-03-14 17:33:13 +010033 cls.prepare_instance_network()
Rohan Kanade60b73092015-02-04 17:58:19 +053034 super(ServersTestJSON, cls).setup_credentials()
35
36 @classmethod
37 def setup_clients(cls):
38 super(ServersTestJSON, cls).setup_clients()
39 cls.client = cls.servers_client
John Warren94d8faf2015-09-15 12:22:24 -040040 cls.networks_client = cls.os.networks_client
John Warren3961acd2015-10-02 14:38:53 -040041 cls.subnets_client = cls.os.subnets_client
Rohan Kanade60b73092015-02-04 17:58:19 +053042
43 @classmethod
44 def resource_setup(cls):
nithya-ganesan222efd72015-01-22 12:20:27 +000045 cls.set_validation_resources()
Andrea Frittoli50bb80d2014-09-15 12:34:27 +010046 super(ServersTestJSON, cls).resource_setup()
Daryl Walleck6b9b2882012-04-08 21:43:39 -050047 cls.meta = {'hello': 'world'}
48 cls.accessIPv4 = '1.1.1.1'
Mauro S. M. Rodrigues54110362013-02-15 13:14:04 -050049 cls.accessIPv6 = '0000:0000:0000:0000:0000:babe:220.12.22.2'
zhuflc6ce5392016-08-17 14:34:37 +080050 cls.name = data_utils.rand_name(cls.__name__ + '-server')
Ghanshyam3390d9f2015-12-25 12:48:02 +090051 cls.password = data_utils.rand_password()
David Kranz0fb14292015-02-11 15:55:20 -050052 disk_config = cls.disk_config
Joseph Lanouxb3e1f872015-01-30 11:13:07 +000053 cls.server_initial = cls.create_test_server(
54 validatable=True,
55 wait_until='ACTIVE',
56 name=cls.name,
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +000057 metadata=cls.meta,
Joseph Lanouxb3e1f872015-01-30 11:13:07 +000058 accessIPv4=cls.accessIPv4,
59 accessIPv6=cls.accessIPv6,
Ghanshyam3390d9f2015-12-25 12:48:02 +090060 disk_config=disk_config,
61 adminPass=cls.password)
ghanshyam0f825252015-08-25 16:02:50 +090062 cls.server = (cls.client.show_server(cls.server_initial['id'])
63 ['server'])
Daryl Walleck6b9b2882012-04-08 21:43:39 -050064
Matt Riedemann778b5f92015-03-11 12:44:28 -070065 def _create_net_subnet_ret_net_from_cidr(self, cidr):
66 name_net = data_utils.rand_name(self.__class__.__name__)
John Warren94d8faf2015-09-15 12:22:24 -040067 net = self.networks_client.create_network(name=name_net)
68 self.addCleanup(self.networks_client.delete_network,
Matt Riedemann778b5f92015-03-11 12:44:28 -070069 net['network']['id'])
70
John Warren3961acd2015-10-02 14:38:53 -040071 subnet = self.subnets_client.create_subnet(
Matt Riedemann778b5f92015-03-11 12:44:28 -070072 network_id=net['network']['id'],
73 cidr=cidr,
74 ip_version=4)
John Warren3961acd2015-10-02 14:38:53 -040075 self.addCleanup(self.subnets_client.delete_subnet,
Matt Riedemann778b5f92015-03-11 12:44:28 -070076 subnet['subnet']['id'])
77 return net
78
Masayuki Igawa209fd502014-02-17 14:46:43 +090079 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080080 @test.idempotent_id('5de47127-9977-400a-936f-abcfbec1218f')
Daryl Wallecked97dca2012-07-04 23:25:45 -050081 def test_verify_server_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050082 # Verify the specified server attributes are set correctly
Daryl Walleck6b9b2882012-04-08 21:43:39 -050083 self.assertEqual(self.accessIPv4, self.server['accessIPv4'])
Mauro S. M. Rodrigues54110362013-02-15 13:14:04 -050084 # NOTE(maurosr): See http://tools.ietf.org/html/rfc5952 (section 4)
85 # Here we compare directly with the canonicalized format.
86 self.assertEqual(self.server['accessIPv6'],
87 str(netaddr.IPAddress(self.accessIPv6)))
Daryl Walleck6b9b2882012-04-08 21:43:39 -050088 self.assertEqual(self.name, self.server['name'])
89 self.assertEqual(self.image_ref, self.server['image']['id'])
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090090 self.assertEqual(self.flavor_ref, self.server['flavor']['id'])
Daryl Walleck6b9b2882012-04-08 21:43:39 -050091 self.assertEqual(self.meta, self.server['metadata'])
92
Masayuki Igawa209fd502014-02-17 14:46:43 +090093 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080094 @test.idempotent_id('9a438d88-10c6-4bcd-8b5b-5b6e25e1346f')
Daryl Wallecked97dca2012-07-04 23:25:45 -050095 def test_list_servers(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050096 # The created server should be in the list of all servers
David Kranzae99b9a2015-02-16 13:37:01 -050097 body = self.client.list_servers()
Daryl Wallecked97dca2012-07-04 23:25:45 -050098 servers = body['servers']
99 found = any([i for i in servers if i['id'] == self.server['id']])
100 self.assertTrue(found)
101
Chris Hoge7579c1a2015-02-26 14:12:15 -0800102 @test.idempotent_id('585e934c-448e-43c4-acbf-d06a9b899997')
Daryl Wallecked97dca2012-07-04 23:25:45 -0500103 def test_list_servers_with_detail(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500104 # The created server should be in the detailed list of all servers
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +0000105 body = self.client.list_servers(detail=True)
Daryl Wallecked97dca2012-07-04 23:25:45 -0500106 servers = body['servers']
107 found = any([i for i in servers if i['id'] == self.server['id']])
108 self.assertTrue(found)
109
Chris Hoge7579c1a2015-02-26 14:12:15 -0800110 @test.idempotent_id('cbc0f52f-05aa-492b-bdc1-84b575ca294b')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400111 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700112 'Instance validation tests are disabled.')
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500113 def test_verify_created_server_vcpus(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500114 # Verify that the number of vcpus reported by the instance matches
115 # the amount stated by the flavor
ghanshyam19973be2015-08-18 15:46:42 +0900116 flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000117 linux_client = remote_client.RemoteClient(
118 self.get_server_ip(self.server),
119 self.ssh_user,
120 self.password,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500121 self.validation_resources['keypair']['private_key'],
122 server=self.server,
123 servers_client=self.client)
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500124 self.assertEqual(flavor['vcpus'], linux_client.get_number_of_vcpus())
125
Chris Hoge7579c1a2015-02-26 14:12:15 -0800126 @test.idempotent_id('ac1ad47f-984b-4441-9274-c9079b7a0666')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400127 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700128 'Instance validation tests are disabled.')
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500129 def test_host_name_is_same_as_server_name(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500130 # Verify the instance host name is the same as the server name
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000131 linux_client = remote_client.RemoteClient(
132 self.get_server_ip(self.server),
133 self.ssh_user,
134 self.password,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500135 self.validation_resources['keypair']['private_key'],
136 server=self.server,
137 servers_client=self.client)
imran malikcdf20382016-06-16 00:43:57 -0700138 hostname = linux_client.get_hostname()
139 msg = ('Failed while verifying servername equals hostname. Expected '
140 'hostname "%s" but got "%s".' % (self.name, hostname))
obutenko149feaf2016-08-31 16:14:45 +0300141 self.assertEqual(self.name.lower(), hostname, msg)
Dan Smith4307f992012-08-16 09:23:20 -0700142
Chris Hoge7579c1a2015-02-26 14:12:15 -0800143 @test.idempotent_id('ed20d3fb-9d1f-4329-b160-543fbd5d9811')
zhufl70f3c772016-10-27 11:52:33 +0800144 @testtools.skipUnless(
145 test.is_scheduler_filter_enabled("ServerGroupAffinityFilter"),
146 'ServerGroupAffinityFilter is not available.')
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900147 def test_create_server_with_scheduler_hint_group(self):
148 # Create a server with the scheduler hint "group".
zhuflb556d252016-10-24 12:15:56 +0800149 group_id = self.create_test_server_group()['id']
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900150 hints = {'group': group_id}
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000151 server = self.create_test_server(scheduler_hints=hints,
David Kranz0fb14292015-02-11 15:55:20 -0500152 wait_until='ACTIVE')
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900153
154 # Check a server is in the group
Ken'ichi Ohmichicd111872015-11-16 06:01:11 +0000155 server_group = (self.server_groups_client.show_server_group(group_id)
ghanshyam2dc13452015-08-24 17:39:25 +0900156 ['server_group'])
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900157 self.assertIn(server['id'], server_group['members'])
158
Chris Hoge7579c1a2015-02-26 14:12:15 -0800159 @test.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2')
Joseph Lanoux38edc052014-09-18 14:25:46 +0000160 @testtools.skipUnless(CONF.service_available.neutron,
161 'Neutron service must be available.')
162 def test_verify_multiple_nics_order(self):
163 # Verify that the networks order given at the server creation is
164 # preserved within the server.
Matt Riedemann778b5f92015-03-11 12:44:28 -0700165 net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
166 net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
Joseph Lanoux38edc052014-09-18 14:25:46 +0000167
168 networks = [{'uuid': net1['network']['id']},
169 {'uuid': net2['network']['id']}]
170
David Kranz0fb14292015-02-11 15:55:20 -0500171 server_multi_nics = self.create_test_server(
Joseph Lanoux38edc052014-09-18 14:25:46 +0000172 networks=networks, wait_until='ACTIVE')
173
Joseph Lanouxe59f0ff2014-10-17 14:56:56 +0000174 # Cleanup server; this is needed in the test case because with the LIFO
175 # nature of the cleanups, if we don't delete the server first, the port
176 # will still be part of the subnet and we'll get a 409 from Neutron
177 # when trying to delete the subnet. The tear down in the base class
178 # will try to delete the server and get a 404 but it's ignored so
179 # we're OK.
zhuflf08e28b2016-12-14 17:29:50 +0800180 self.addCleanup(self.delete_server, server_multi_nics['id'])
Joseph Lanouxe59f0ff2014-10-17 14:56:56 +0000181
ghanshyam0f825252015-08-25 16:02:50 +0900182 addresses = (self.client.list_addresses(server_multi_nics['id'])
183 ['addresses'])
Joseph Lanoux38edc052014-09-18 14:25:46 +0000184
venkata anilbd2d49a2015-01-16 08:07:15 +0000185 # We can't predict the ip addresses assigned to the server on networks.
186 # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at
187 # other times ['19.80.0.3', '19.86.0.3']. So we check if the first
188 # address is in first network, similarly second address is in second
189 # network.
Matt Riedemann778b5f92015-03-11 12:44:28 -0700190 addr = [addresses[net1['network']['name']][0]['addr'],
191 addresses[net2['network']['name']][0]['addr']]
venkata anilbd2d49a2015-01-16 08:07:15 +0000192 networks = [netaddr.IPNetwork('19.80.0.0/24'),
193 netaddr.IPNetwork('19.86.0.0/24')]
194 for address, network in zip(addr, networks):
195 self.assertIn(address, network)
Joseph Lanoux38edc052014-09-18 14:25:46 +0000196
Matt Riedemann778b5f92015-03-11 12:44:28 -0700197 @test.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2')
198 @testtools.skipUnless(CONF.service_available.neutron,
199 'Neutron service must be available.')
Matt Riedemann778b5f92015-03-11 12:44:28 -0700200 def test_verify_duplicate_network_nics(self):
201 # Verify that server creation does not fail when more than one nic
202 # is created on the same network.
203 net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
204 net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
205
206 networks = [{'uuid': net1['network']['id']},
207 {'uuid': net2['network']['id']},
208 {'uuid': net1['network']['id']}]
209
210 server_multi_nics = self.create_test_server(
211 networks=networks, wait_until='ACTIVE')
zhuflf08e28b2016-12-14 17:29:50 +0800212 self.addCleanup(self.delete_server, server_multi_nics['id'])
Matt Riedemann778b5f92015-03-11 12:44:28 -0700213
ghanshyam0f825252015-08-25 16:02:50 +0900214 addresses = (self.client.list_addresses(server_multi_nics['id'])
215 ['addresses'])
Matt Riedemann778b5f92015-03-11 12:44:28 -0700216
217 addr = [addresses[net1['network']['name']][0]['addr'],
218 addresses[net2['network']['name']][0]['addr'],
219 addresses[net1['network']['name']][1]['addr']]
220 networks = [netaddr.IPNetwork('19.80.0.0/24'),
221 netaddr.IPNetwork('19.86.0.0/24'),
222 netaddr.IPNetwork('19.80.0.0/24')]
223 for address, network in zip(addr, networks):
224 self.assertIn(address, network)
225
Dan Smith4307f992012-08-16 09:23:20 -0700226
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800227class ServersWithSpecificFlavorTestJSON(base.BaseV2ComputeAdminTest):
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800228 disk_config = 'AUTO'
229
230 @classmethod
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000231 def setup_credentials(cls):
Attila Fazekas423834d2014-03-14 17:33:13 +0100232 cls.prepare_instance_network()
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000233 super(ServersWithSpecificFlavorTestJSON, cls).setup_credentials()
234
235 @classmethod
236 def setup_clients(cls):
Rohan Kanade60b73092015-02-04 17:58:19 +0530237 super(ServersWithSpecificFlavorTestJSON, cls).setup_clients()
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800238 cls.flavor_client = cls.os_adm.flavors_client
Attila Fazekas076f79f2014-03-14 17:43:46 +0100239 cls.client = cls.servers_client
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800240
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000241 @classmethod
242 def resource_setup(cls):
243 cls.set_validation_resources()
244
245 super(ServersWithSpecificFlavorTestJSON, cls).resource_setup()
246
Chris Hoge7579c1a2015-02-26 14:12:15 -0800247 @test.idempotent_id('b3c7bcfc-bb5b-4e22-b517-c7f686b802ca')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400248 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700249 'Instance validation tests are disabled.')
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800250 def test_verify_created_server_ephemeral_disk(self):
251 # Verify that the ephemeral disk is created when creating server
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000252 flavor_base = self.flavors_client.show_flavor(
253 self.flavor_ref)['flavor']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800254
zhufl25f5ca52016-10-24 16:06:08 +0800255 def create_flavor_with_ephemeral(ephem_disk):
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800256 flavor_with_eph_disk_id = data_utils.rand_int_id(start=1000)
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000257
258 ram = flavor_base['ram']
259 vcpus = flavor_base['vcpus']
260 disk = flavor_base['disk']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800261
Yaroslav Lobankovf9103442016-11-02 19:37:03 +0300262 if ephem_disk > 0:
263 # Create a flavor with ephemeral disk
264 flavor_name = data_utils.rand_name('eph_flavor')
265 flavor = self.flavor_client.create_flavor(
266 name=flavor_name, ram=ram, vcpus=vcpus, disk=disk,
267 id=flavor_with_eph_disk_id, ephemeral=ephem_disk)['flavor']
268 else:
269 # Create a flavor without ephemeral disk
270 flavor_name = data_utils.rand_name('no_eph_flavor')
271 flavor = self.flavor_client.create_flavor(
272 name=flavor_name, ram=ram, vcpus=vcpus, disk=disk,
273 id=flavor_with_eph_disk_id)['flavor']
Attila Fazekas076f79f2014-03-14 17:43:46 +0100274 self.addCleanup(flavor_clean_up, flavor['id'])
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800275
276 return flavor['id']
277
Attila Fazekas076f79f2014-03-14 17:43:46 +0100278 def flavor_clean_up(flavor_id):
David Kranz2fa77b22015-02-09 11:39:50 -0500279 self.flavor_client.delete_flavor(flavor_id)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800280 self.flavor_client.wait_for_resource_deletion(flavor_id)
281
zhufl25f5ca52016-10-24 16:06:08 +0800282 flavor_with_eph_disk_id = create_flavor_with_ephemeral(ephem_disk=1)
283 flavor_no_eph_disk_id = create_flavor_with_ephemeral(ephem_disk=0)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800284
285 admin_pass = self.image_ssh_password
286
Ken'ichi Ohmichie1dc9912015-08-27 09:06:26 +0000287 server_no_eph_disk = self.create_test_server(
288 validatable=True,
289 wait_until='ACTIVE',
290 adminPass=admin_pass,
291 flavor=flavor_no_eph_disk_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000292
zhufl25f5ca52016-10-24 16:06:08 +0800293 # Get partition number of server without ephemeral disk.
Ken'ichi Ohmichi76800242015-07-03 05:12:31 +0000294 server_no_eph_disk = self.client.show_server(
ghanshyam0f825252015-08-25 16:02:50 +0900295 server_no_eph_disk['id'])['server']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000296 linux_client = remote_client.RemoteClient(
297 self.get_server_ip(server_no_eph_disk),
298 self.ssh_user,
299 admin_pass,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500300 self.validation_resources['keypair']['private_key'],
301 server=server_no_eph_disk,
302 servers_client=self.client)
Evgeny Antyshev4894a912016-11-21 12:17:18 +0000303 disks_num = len(linux_client.get_disks().split('\n'))
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800304
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000305 # Explicit server deletion necessary for Juno compatibility
306 self.client.delete_server(server_no_eph_disk['id'])
307
Ken'ichi Ohmichie1dc9912015-08-27 09:06:26 +0000308 server_with_eph_disk = self.create_test_server(
309 validatable=True,
310 wait_until='ACTIVE',
311 adminPass=admin_pass,
312 flavor=flavor_with_eph_disk_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000313
Ken'ichi Ohmichi76800242015-07-03 05:12:31 +0000314 server_with_eph_disk = self.client.show_server(
ghanshyam0f825252015-08-25 16:02:50 +0900315 server_with_eph_disk['id'])['server']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000316 linux_client = remote_client.RemoteClient(
317 self.get_server_ip(server_with_eph_disk),
318 self.ssh_user,
319 admin_pass,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500320 self.validation_resources['keypair']['private_key'],
321 server=server_with_eph_disk,
322 servers_client=self.client)
Evgeny Antyshev4894a912016-11-21 12:17:18 +0000323 disks_num_eph = len(linux_client.get_disks().split('\n'))
324 self.assertEqual(disks_num + 1, disks_num_eph)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800325
326
Attila Fazekas19044d52013-02-16 07:35:06 +0100327class ServersTestManualDisk(ServersTestJSON):
328 disk_config = 'MANUAL'
329
Daryl Walleck0aea0032012-12-04 00:53:28 -0600330 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +0530331 def skip_checks(cls):
332 super(ServersTestManualDisk, cls).skip_checks()
Sean Dague86bd8422013-12-20 09:56:44 -0500333 if not CONF.compute_feature_enabled.disk_config:
Daryl Walleck0aea0032012-12-04 00:53:28 -0600334 msg = "DiskConfig extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +0800335 raise cls.skipException(msg)