blob: 78f0db434e67da2ebce5367ca464fa10d9da9737 [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
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +000022from tempest.common import waiters
Sean Dague86bd8422013-12-20 09:56:44 -050023from tempest import config
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
Joseph Lanouxb3e1f872015-01-30 11:13:07 +000054 cls.server_initial = cls.create_test_server(
55 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)
ghanshyam0f825252015-08-25 16:02:50 +090063 cls.server = (cls.client.show_server(cls.server_initial['id'])
64 ['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')
Chris Hoge7579c1a2015-02-26 14:12:15 -080081 @test.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')
Chris Hoge7579c1a2015-02-26 14:12:15 -080095 @test.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
Chris Hoge7579c1a2015-02-26 14:12:15 -0800103 @test.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
Chris Hoge7579c1a2015-02-26 14:12:15 -0800111 @test.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)
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500125 self.assertEqual(flavor['vcpus'], linux_client.get_number_of_vcpus())
126
Chris Hoge7579c1a2015-02-26 14:12:15 -0800127 @test.idempotent_id('ac1ad47f-984b-4441-9274-c9079b7a0666')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400128 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700129 'Instance validation tests are disabled.')
Daryl Walleck6b9b2882012-04-08 21:43:39 -0500130 def test_host_name_is_same_as_server_name(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500131 # Verify the instance host name is the same as the server name
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000132 linux_client = remote_client.RemoteClient(
133 self.get_server_ip(self.server),
134 self.ssh_user,
135 self.password,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500136 self.validation_resources['keypair']['private_key'],
137 server=self.server,
138 servers_client=self.client)
imran malikcdf20382016-06-16 00:43:57 -0700139 hostname = linux_client.get_hostname()
140 msg = ('Failed while verifying servername equals hostname. Expected '
141 'hostname "%s" but got "%s".' % (self.name, hostname))
obutenko149feaf2016-08-31 16:14:45 +0300142 self.assertEqual(self.name.lower(), hostname, msg)
Dan Smith4307f992012-08-16 09:23:20 -0700143
Chris Hoge7579c1a2015-02-26 14:12:15 -0800144 @test.idempotent_id('ed20d3fb-9d1f-4329-b160-543fbd5d9811')
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900145 def test_create_server_with_scheduler_hint_group(self):
146 # Create a server with the scheduler hint "group".
147 name = data_utils.rand_name('server_group')
148 policies = ['affinity']
Ken'ichi Ohmichi7ca54b82015-07-07 01:10:26 +0000149 body = self.server_groups_client.create_server_group(
ghanshyam2dc13452015-08-24 17:39:25 +0900150 name=name, policies=policies)['server_group']
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900151 group_id = body['id']
Ken'ichi Ohmichi7ca54b82015-07-07 01:10:26 +0000152 self.addCleanup(self.server_groups_client.delete_server_group,
153 group_id)
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900154
155 hints = {'group': group_id}
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000156 server = self.create_test_server(scheduler_hints=hints,
David Kranz0fb14292015-02-11 15:55:20 -0500157 wait_until='ACTIVE')
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900158
159 # Check a server is in the group
Ken'ichi Ohmichicd111872015-11-16 06:01:11 +0000160 server_group = (self.server_groups_client.show_server_group(group_id)
ghanshyam2dc13452015-08-24 17:39:25 +0900161 ['server_group'])
Ken'ichi Ohmichi60a67f72014-05-20 09:19:50 +0900162 self.assertIn(server['id'], server_group['members'])
163
Chris Hoge7579c1a2015-02-26 14:12:15 -0800164 @test.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2')
Joseph Lanoux38edc052014-09-18 14:25:46 +0000165 @testtools.skipUnless(CONF.service_available.neutron,
166 'Neutron service must be available.')
167 def test_verify_multiple_nics_order(self):
168 # Verify that the networks order given at the server creation is
169 # preserved within the server.
Matt Riedemann778b5f92015-03-11 12:44:28 -0700170 net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
171 net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
Joseph Lanoux38edc052014-09-18 14:25:46 +0000172
173 networks = [{'uuid': net1['network']['id']},
174 {'uuid': net2['network']['id']}]
175
David Kranz0fb14292015-02-11 15:55:20 -0500176 server_multi_nics = self.create_test_server(
Joseph Lanoux38edc052014-09-18 14:25:46 +0000177 networks=networks, wait_until='ACTIVE')
178
Joseph Lanouxe59f0ff2014-10-17 14:56:56 +0000179 # Cleanup server; this is needed in the test case because with the LIFO
180 # nature of the cleanups, if we don't delete the server first, the port
181 # will still be part of the subnet and we'll get a 409 from Neutron
182 # when trying to delete the subnet. The tear down in the base class
183 # will try to delete the server and get a 404 but it's ignored so
184 # we're OK.
185 def cleanup_server():
186 self.client.delete_server(server_multi_nics['id'])
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +0000187 waiters.wait_for_server_termination(self.client,
188 server_multi_nics['id'])
Joseph Lanouxe59f0ff2014-10-17 14:56:56 +0000189
190 self.addCleanup(cleanup_server)
191
ghanshyam0f825252015-08-25 16:02:50 +0900192 addresses = (self.client.list_addresses(server_multi_nics['id'])
193 ['addresses'])
Joseph Lanoux38edc052014-09-18 14:25:46 +0000194
venkata anilbd2d49a2015-01-16 08:07:15 +0000195 # We can't predict the ip addresses assigned to the server on networks.
196 # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at
197 # other times ['19.80.0.3', '19.86.0.3']. So we check if the first
198 # address is in first network, similarly second address is in second
199 # network.
Matt Riedemann778b5f92015-03-11 12:44:28 -0700200 addr = [addresses[net1['network']['name']][0]['addr'],
201 addresses[net2['network']['name']][0]['addr']]
venkata anilbd2d49a2015-01-16 08:07:15 +0000202 networks = [netaddr.IPNetwork('19.80.0.0/24'),
203 netaddr.IPNetwork('19.86.0.0/24')]
204 for address, network in zip(addr, networks):
205 self.assertIn(address, network)
Joseph Lanoux38edc052014-09-18 14:25:46 +0000206
Matt Riedemann778b5f92015-03-11 12:44:28 -0700207 @test.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2')
208 @testtools.skipUnless(CONF.service_available.neutron,
209 'Neutron service must be available.')
Matt Riedemann778b5f92015-03-11 12:44:28 -0700210 def test_verify_duplicate_network_nics(self):
211 # Verify that server creation does not fail when more than one nic
212 # is created on the same network.
213 net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
214 net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
215
216 networks = [{'uuid': net1['network']['id']},
217 {'uuid': net2['network']['id']},
218 {'uuid': net1['network']['id']}]
219
220 server_multi_nics = self.create_test_server(
221 networks=networks, wait_until='ACTIVE')
222
223 def cleanup_server():
224 self.client.delete_server(server_multi_nics['id'])
Ken'ichi Ohmichie91a0c62015-08-13 02:09:16 +0000225 waiters.wait_for_server_termination(self.client,
226 server_multi_nics['id'])
Matt Riedemann778b5f92015-03-11 12:44:28 -0700227
228 self.addCleanup(cleanup_server)
229
ghanshyam0f825252015-08-25 16:02:50 +0900230 addresses = (self.client.list_addresses(server_multi_nics['id'])
231 ['addresses'])
Matt Riedemann778b5f92015-03-11 12:44:28 -0700232
233 addr = [addresses[net1['network']['name']][0]['addr'],
234 addresses[net2['network']['name']][0]['addr'],
235 addresses[net1['network']['name']][1]['addr']]
236 networks = [netaddr.IPNetwork('19.80.0.0/24'),
237 netaddr.IPNetwork('19.86.0.0/24'),
238 netaddr.IPNetwork('19.80.0.0/24')]
239 for address, network in zip(addr, networks):
240 self.assertIn(address, network)
241
Dan Smith4307f992012-08-16 09:23:20 -0700242
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800243class ServersWithSpecificFlavorTestJSON(base.BaseV2ComputeAdminTest):
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800244 disk_config = 'AUTO'
245
246 @classmethod
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000247 def setup_credentials(cls):
Attila Fazekas423834d2014-03-14 17:33:13 +0100248 cls.prepare_instance_network()
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000249 super(ServersWithSpecificFlavorTestJSON, cls).setup_credentials()
250
251 @classmethod
252 def setup_clients(cls):
Rohan Kanade60b73092015-02-04 17:58:19 +0530253 super(ServersWithSpecificFlavorTestJSON, cls).setup_clients()
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800254 cls.flavor_client = cls.os_adm.flavors_client
Attila Fazekas076f79f2014-03-14 17:43:46 +0100255 cls.client = cls.servers_client
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800256
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000257 @classmethod
258 def resource_setup(cls):
259 cls.set_validation_resources()
260
261 super(ServersWithSpecificFlavorTestJSON, cls).resource_setup()
262
Chris Hoge7579c1a2015-02-26 14:12:15 -0800263 @test.idempotent_id('b3c7bcfc-bb5b-4e22-b517-c7f686b802ca')
Matthew Treinishe5cca002015-05-11 15:36:50 -0400264 @testtools.skipUnless(CONF.validation.run_validation,
Matt Riedemann6c668202014-03-24 09:17:10 -0700265 'Instance validation tests are disabled.')
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800266 def test_verify_created_server_ephemeral_disk(self):
267 # Verify that the ephemeral disk is created when creating server
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000268 flavor_base = self.flavors_client.show_flavor(
269 self.flavor_ref)['flavor']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800270
Attila Fazekas076f79f2014-03-14 17:43:46 +0100271 def create_flavor_with_extra_specs():
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800272 flavor_with_eph_disk_name = data_utils.rand_name('eph_flavor')
273 flavor_with_eph_disk_id = data_utils.rand_int_id(start=1000)
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000274
275 ram = flavor_base['ram']
276 vcpus = flavor_base['vcpus']
277 disk = flavor_base['disk']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800278
279 # Create a flavor with extra specs
David Kranz2fa77b22015-02-09 11:39:50 -0500280 flavor = (self.flavor_client.
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000281 create_flavor(name=flavor_with_eph_disk_name,
282 ram=ram, vcpus=vcpus, disk=disk,
283 id=flavor_with_eph_disk_id,
ghanshyam19973be2015-08-18 15:46:42 +0900284 ephemeral=1))['flavor']
Attila Fazekas076f79f2014-03-14 17:43:46 +0100285 self.addCleanup(flavor_clean_up, flavor['id'])
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800286
287 return flavor['id']
288
Attila Fazekas076f79f2014-03-14 17:43:46 +0100289 def create_flavor_without_extra_specs():
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800290 flavor_no_eph_disk_name = data_utils.rand_name('no_eph_flavor')
291 flavor_no_eph_disk_id = data_utils.rand_int_id(start=1000)
292
Evgeny Antyshev10ed6202015-12-25 10:47:33 +0000293 ram = flavor_base['ram']
294 vcpus = flavor_base['vcpus']
295 disk = flavor_base['disk']
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800296
297 # Create a flavor without extra specs
David Kranz2fa77b22015-02-09 11:39:50 -0500298 flavor = (self.flavor_client.
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000299 create_flavor(name=flavor_no_eph_disk_name,
300 ram=ram, vcpus=vcpus, disk=disk,
ghanshyam19973be2015-08-18 15:46:42 +0900301 id=flavor_no_eph_disk_id))['flavor']
Attila Fazekas076f79f2014-03-14 17:43:46 +0100302 self.addCleanup(flavor_clean_up, flavor['id'])
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800303
304 return flavor['id']
305
Attila Fazekas076f79f2014-03-14 17:43:46 +0100306 def flavor_clean_up(flavor_id):
David Kranz2fa77b22015-02-09 11:39:50 -0500307 self.flavor_client.delete_flavor(flavor_id)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800308 self.flavor_client.wait_for_resource_deletion(flavor_id)
309
Attila Fazekas076f79f2014-03-14 17:43:46 +0100310 flavor_with_eph_disk_id = create_flavor_with_extra_specs()
311 flavor_no_eph_disk_id = create_flavor_without_extra_specs()
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800312
313 admin_pass = self.image_ssh_password
314
Ken'ichi Ohmichie1dc9912015-08-27 09:06:26 +0000315 server_no_eph_disk = self.create_test_server(
316 validatable=True,
317 wait_until='ACTIVE',
318 adminPass=admin_pass,
319 flavor=flavor_no_eph_disk_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000320
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800321 # Get partition number of server without extra specs.
Ken'ichi Ohmichi76800242015-07-03 05:12:31 +0000322 server_no_eph_disk = self.client.show_server(
ghanshyam0f825252015-08-25 16:02:50 +0900323 server_no_eph_disk['id'])['server']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000324 linux_client = remote_client.RemoteClient(
325 self.get_server_ip(server_no_eph_disk),
326 self.ssh_user,
327 admin_pass,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500328 self.validation_resources['keypair']['private_key'],
329 server=server_no_eph_disk,
330 servers_client=self.client)
Attila Fazekas076f79f2014-03-14 17:43:46 +0100331 partition_num = len(linux_client.get_partitions().split('\n'))
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800332
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000333 # Explicit server deletion necessary for Juno compatibility
334 self.client.delete_server(server_no_eph_disk['id'])
335
Ken'ichi Ohmichie1dc9912015-08-27 09:06:26 +0000336 server_with_eph_disk = self.create_test_server(
337 validatable=True,
338 wait_until='ACTIVE',
339 adminPass=admin_pass,
340 flavor=flavor_with_eph_disk_id)
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000341
Ken'ichi Ohmichi76800242015-07-03 05:12:31 +0000342 server_with_eph_disk = self.client.show_server(
ghanshyam0f825252015-08-25 16:02:50 +0900343 server_with_eph_disk['id'])['server']
Joseph Lanouxffe09dd2015-03-18 16:45:33 +0000344 linux_client = remote_client.RemoteClient(
345 self.get_server_ip(server_with_eph_disk),
346 self.ssh_user,
347 admin_pass,
Andrea Frittoli (andreaf)2a70a612016-04-29 16:09:13 -0500348 self.validation_resources['keypair']['private_key'],
349 server=server_with_eph_disk,
350 servers_client=self.client)
Attila Fazekas076f79f2014-03-14 17:43:46 +0100351 partition_num_emph = len(linux_client.get_partitions().split('\n'))
352 self.assertEqual(partition_num + 1, partition_num_emph)
Chang Bo Guoedd6ec02013-12-12 23:53:09 -0800353
354
Attila Fazekas19044d52013-02-16 07:35:06 +0100355class ServersTestManualDisk(ServersTestJSON):
356 disk_config = 'MANUAL'
357
Daryl Walleck0aea0032012-12-04 00:53:28 -0600358 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +0530359 def skip_checks(cls):
360 super(ServersTestManualDisk, cls).skip_checks()
Sean Dague86bd8422013-12-20 09:56:44 -0500361 if not CONF.compute_feature_enabled.disk_config:
Daryl Walleck0aea0032012-12-04 00:53:28 -0600362 msg = "DiskConfig extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +0800363 raise cls.skipException(msg)