blob: dba1c92d7257ac8de740a22facdcc0099001b0df [file] [log] [blame]
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +09001# Copyright 2013 NEC Corporation
2# 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
Andrea Frittoli247058f2014-07-16 16:09:22 +010016from tempest.common import custom_matchers
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +000017from tempest.common import waiters
Matthew Treinish6c072292014-01-29 19:15:52 +000018from tempest import config
Clark Boylanff31bcc2014-11-04 13:44:04 -080019from tempest import exceptions
Jordan Pittier35a63752016-08-30 13:09:12 +020020from tempest.lib.common.utils import test_utils
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090021from tempest.scenario import manager
Masayuki Igawa4ded9f02014-02-17 15:05:59 +090022from tempest import test
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090023
Matthew Treinish6c072292014-01-29 19:15:52 +000024CONF = config.CONF
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090025
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090026
Andrea Frittoli247058f2014-07-16 16:09:22 +010027class TestMinimumBasicScenario(manager.ScenarioTest):
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090028
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000029 """This is a basic minimum scenario test.
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090030
31 This test below:
32 * across the multiple components
33 * as a regular user
34 * with and without optional parameters
35 * check command outputs
36
Alexander Gubanova5ab12e2015-11-17 18:18:46 +020037 Steps:
38 1. Create image
39 2. Create keypair
40 3. Boot instance with keypair and get list of instances
41 4. Create volume and show list of volumes
42 5. Attach volume to instance and getlist of volumes
43 6. Add IP to instance
44 7. Create and add security group to instance
45 8. Check SSH connection to instance
46 9. Reboot instance
47 10. Check SSH connection to instance after reboot
48
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090049 """
50
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090051 def nova_list(self):
David Kranzae99b9a2015-02-16 13:37:01 -050052 servers = self.servers_client.list_servers()
Andrea Frittoli247058f2014-07-16 16:09:22 +010053 # The list servers in the compute client is inconsistent...
Jordan Pittier7cf64762015-10-14 15:01:12 +020054 return servers['servers']
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090055
Jordan Pittier7cf64762015-10-14 15:01:12 +020056 def nova_show(self, server):
57 got_server = (self.servers_client.show_server(server['id'])
ghanshyam0f825252015-08-25 16:02:50 +090058 ['server'])
Jordan Pittier5d367152015-08-19 12:03:49 +020059 excluded_keys = ['OS-EXT-AZ:availability_zone']
60 # Exclude these keys because of LP:#1486475
61 excluded_keys.extend(['OS-EXT-STS:power_state', 'updated'])
Andrea Frittoli247058f2014-07-16 16:09:22 +010062 self.assertThat(
Jordan Pittier7cf64762015-10-14 15:01:12 +020063 server, custom_matchers.MatchesDictExceptForKeys(
Jordan Pittier5d367152015-08-19 12:03:49 +020064 got_server, excluded_keys=excluded_keys))
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090065
Jordan Pittier7cf64762015-10-14 15:01:12 +020066 def cinder_show(self, volume):
67 got_volume = self.volumes_client.show_volume(volume['id'])['volume']
68 self.assertEqual(volume, got_volume)
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090069
Jordan Pittier7cf64762015-10-14 15:01:12 +020070 def nova_reboot(self, server):
Ken'ichi Ohmichi36b714c2015-12-09 08:12:47 +000071 self.servers_client.reboot_server(server['id'], type='SOFT')
Masayuki Igawa8bf68672016-01-15 14:43:10 +090072 waiters.wait_for_server_status(self.servers_client,
73 server['id'], 'ACTIVE')
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090074
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090075 def check_partitions(self):
Andrea Frittoli247058f2014-07-16 16:09:22 +010076 # NOTE(andreaf) The device name may be different on different guest OS
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090077 partitions = self.linux_client.get_partitions()
Alessandro Pilottib4aa55d2014-08-17 13:57:16 +030078 self.assertEqual(1, partitions.count(CONF.compute.volume_device_name))
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +090079
Jordan Pittier7cf64762015-10-14 15:01:12 +020080 def create_and_add_security_group_to_server(self, server):
Yair Fried1fc32a12014-08-04 09:11:30 +030081 secgroup = self._create_security_group()
Jordan Pittier7cf64762015-10-14 15:01:12 +020082 self.servers_client.add_security_group(server['id'],
Ken'ichi Ohmichie6349f32015-12-09 06:47:54 +000083 name=secgroup['name'])
Andrea Frittoli247058f2014-07-16 16:09:22 +010084 self.addCleanup(self.servers_client.remove_security_group,
Ken'ichi Ohmichi36b714c2015-12-09 08:12:47 +000085 server['id'], name=secgroup['name'])
Grishkin0f1e11c2014-05-04 20:44:52 +040086
Clark Boylanff31bcc2014-11-04 13:44:04 -080087 def wait_for_secgroup_add():
Jordan Pittier7cf64762015-10-14 15:01:12 +020088 body = (self.servers_client.show_server(server['id'])
ghanshyam0f825252015-08-25 16:02:50 +090089 ['server'])
Clark Boylanff31bcc2014-11-04 13:44:04 -080090 return {'name': secgroup['name']} in body['security_groups']
91
Jordan Pittier35a63752016-08-30 13:09:12 +020092 if not test_utils.call_until_true(wait_for_secgroup_add,
93 CONF.compute.build_timeout,
94 CONF.compute.build_interval):
Clark Boylanff31bcc2014-11-04 13:44:04 -080095 msg = ('Timed out waiting for adding security group %s to server '
Jordan Pittier7cf64762015-10-14 15:01:12 +020096 '%s' % (secgroup['id'], server['id']))
Clark Boylanff31bcc2014-11-04 13:44:04 -080097 raise exceptions.TimeoutException(msg)
98
Chris Hoge7579c1a2015-02-26 14:12:15 -080099 @test.idempotent_id('bdbb5441-9204-419d-a225-b4fdbfb1a1a8')
Masayuki Igawa4ded9f02014-02-17 15:05:59 +0900100 @test.services('compute', 'volume', 'image', 'network')
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +0900101 def test_minimum_basic_scenario(self):
Jordan Pittier1e443ec2015-11-20 16:15:58 +0100102 image = self.glance_image_create()
Jordan Pittier7cf64762015-10-14 15:01:12 +0200103 keypair = self.create_keypair()
JordanP3fe2dc32014-11-17 13:06:01 +0100104
lanoux5fc14522015-09-21 08:17:35 +0000105 server = self.create_server(image_id=image,
106 key_name=keypair['name'],
107 wait_until='ACTIVE')
Jordan Pittier7cf64762015-10-14 15:01:12 +0200108 servers = self.nova_list()
109 self.assertIn(server['id'], [x['id'] for x in servers])
JordanP3fe2dc32014-11-17 13:06:01 +0100110
Jordan Pittier7cf64762015-10-14 15:01:12 +0200111 self.nova_show(server)
112
Jordan Pittierbbb17122016-01-26 17:10:55 +0100113 volume = self.create_volume()
114 volumes = self.volumes_client.list_volumes()['volumes']
Jordan Pittier7cf64762015-10-14 15:01:12 +0200115 self.assertIn(volume['id'], [x['id'] for x in volumes])
116
117 self.cinder_show(volume)
118
119 volume = self.nova_volume_attach(server, volume)
120 self.addCleanup(self.nova_volume_detach, server, volume)
121 self.cinder_show(volume)
122
123 floating_ip = self.create_floating_ip(server)
124 self.create_and_add_security_group_to_server(server)
125
Alexander Gubanova5ab12e2015-11-17 18:18:46 +0200126 # check that we can SSH to the server before reboot
Jordan Pittier7cf64762015-10-14 15:01:12 +0200127 self.linux_client = self.get_remote_client(
128 floating_ip['ip'], private_key=keypair['private_key'])
Alexander Gubanova5ab12e2015-11-17 18:18:46 +0200129
Jordan Pittier7cf64762015-10-14 15:01:12 +0200130 self.nova_reboot(server)
131
Alexander Gubanova5ab12e2015-11-17 18:18:46 +0200132 # check that we can SSH to the server after reboot
133 # (both connections are part of the scenario)
Jordan Pittier7cf64762015-10-14 15:01:12 +0200134 self.linux_client = self.get_remote_client(
135 floating_ip['ip'], private_key=keypair['private_key'])
Alexander Gubanova5ab12e2015-11-17 18:18:46 +0200136
Masayuki Igawa73d9f3a2013-05-24 10:30:01 +0900137 self.check_partitions()