blob: 73ff6b40a613caa82e986a4edd35fcc1aa2986f5 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipes051075a2012-04-28 17:39:37 -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
Masayuki Igawa259c1132013-10-31 17:48:44 +090016from tempest.common.utils import data_utils
Andrea Frittolif5da28b2013-12-06 07:08:07 +000017from tempest.common.utils import test_utils
Matthew Treinish6c072292014-01-29 19:15:52 +000018from tempest import config
Matthew Treinishf4a9b0f2013-07-26 16:58:26 -040019from tempest.openstack.common import log as logging
Sean Dague6dbc6da2013-05-08 17:49:46 -040020from tempest.scenario import manager
Matthew Treinish2153ec02013-09-09 20:57:30 +000021from tempest.test import services
Jay Pipes051075a2012-04-28 17:39:37 -040022
Andrea Frittolif5da28b2013-12-06 07:08:07 +000023import testscenarios
24
Matthew Treinish6c072292014-01-29 19:15:52 +000025CONF = config.CONF
26
Jay Pipes051075a2012-04-28 17:39:37 -040027LOG = logging.getLogger(__name__)
28
Andrea Frittolif5da28b2013-12-06 07:08:07 +000029# NOTE(andreaf) - nose does not honour the load_tests protocol
30# however it's test discovery regex will match anything
31# which includes _tests. So nose would require some further
32# investigation to be supported with this
33load_tests = testscenarios.load_tests_apply_scenarios
34
Jay Pipes051075a2012-04-28 17:39:37 -040035
Sean Dague6dbc6da2013-05-08 17:49:46 -040036class TestServerBasicOps(manager.OfficialClientTest):
Jay Pipes051075a2012-04-28 17:39:37 -040037
38 """
39 This smoke test case follows this basic set of operations:
40
41 * Create a keypair for use in launching an instance
42 * Create a security group to control network access in instance
43 * Add simple permissive rules to the security group
44 * Launch an instance
45 * Pause/unpause the instance
46 * Suspend/resume the instance
47 * Terminate the instance
48 """
49
Andrea Frittolif5da28b2013-12-06 07:08:07 +000050 scenario_utils = test_utils.InputScenarioUtils()
51 scenario_flavor = scenario_utils.scenario_flavors
52 scenario_image = scenario_utils.scenario_images
53
54 scenarios = testscenarios.multiply_scenarios(scenario_image,
55 scenario_flavor)
56
57 def setUp(self):
58 super(TestServerBasicOps, self).setUp()
59 # Setup image and flavor the test instance
60 # Support both configured and injected values
61 if not hasattr(self, 'image_ref'):
Matthew Treinish6c072292014-01-29 19:15:52 +000062 self.image_ref = CONF.compute.image_ref
Andrea Frittolif5da28b2013-12-06 07:08:07 +000063 if not hasattr(self, 'flavor_ref'):
Matthew Treinish6c072292014-01-29 19:15:52 +000064 self.flavor_ref = CONF.compute.flavor_ref
Andrea Frittolif5da28b2013-12-06 07:08:07 +000065 self.image_utils = test_utils.ImageUtils()
66 if not self.image_utils.is_flavor_enough(self.flavor_ref,
67 self.image_ref):
68 raise self.skipException(
69 '{image} does not fit in {flavor}'.format(
70 image=self.image_ref, flavor=self.flavor_ref
71 )
72 )
Matthew Treinish6c072292014-01-29 19:15:52 +000073 self.run_ssh = CONF.compute.run_ssh and \
Andrea Frittolif5da28b2013-12-06 07:08:07 +000074 self.image_utils.is_sshable_image(self.image_ref)
75 self.ssh_user = self.image_utils.ssh_user(self.image_ref)
76 LOG.debug('Starting test for i:{image}, f:{flavor}. '
77 'Run ssh: {ssh}, user: {ssh_user}'.format(
78 image=self.image_ref, flavor=self.flavor_ref,
79 ssh=self.run_ssh, ssh_user=self.ssh_user))
80
Ken'ichi Ohmichi599d1b82013-08-19 18:48:37 +090081 def add_keypair(self):
82 self.keypair = self.create_keypair()
Jay Pipes051075a2012-04-28 17:39:37 -040083
ivan-zhu19977392013-01-12 21:57:55 +080084 def create_security_group(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +090085 sg_name = data_utils.rand_name('secgroup-smoke')
Jay Pipes051075a2012-04-28 17:39:37 -040086 sg_desc = sg_name + " description"
Maru Newbydec13ec2012-08-30 11:19:17 -070087 self.secgroup = self.compute_client.security_groups.create(sg_name,
88 sg_desc)
Giulio Fidente92f77192013-08-26 17:13:28 +020089 self.assertEqual(self.secgroup.name, sg_name)
90 self.assertEqual(self.secgroup.description, sg_desc)
91 self.set_resource('secgroup', self.secgroup)
Jay Pipes051075a2012-04-28 17:39:37 -040092
93 # Add rules to the security group
Yair Friedeb69f3f2013-10-10 13:18:16 +030094 self._create_loginable_secgroup_rule_nova(secgroup_id=self.secgroup.id)
Jay Pipes051075a2012-04-28 17:39:37 -040095
ivan-zhu19977392013-01-12 21:57:55 +080096 def boot_instance(self):
Andrea Frittolif5da28b2013-12-06 07:08:07 +000097 # Create server with image and flavor from input scenario
Jay Pipes051075a2012-04-28 17:39:37 -040098 create_kwargs = {
Ken'ichi Ohmichi599d1b82013-08-19 18:48:37 +090099 'key_name': self.keypair.id
Jay Pipes051075a2012-04-28 17:39:37 -0400100 }
Andrea Frittolif5da28b2013-12-06 07:08:07 +0000101 instance = self.create_server(image=self.image_ref,
102 flavor=self.flavor_ref,
103 create_kwargs=create_kwargs)
Ken'ichi Ohmichi61f272b2013-08-15 15:58:53 +0900104 self.set_resource('instance', instance)
Jay Pipes051075a2012-04-28 17:39:37 -0400105
ivan-zhu19977392013-01-12 21:57:55 +0800106 def pause_server(self):
Jay Pipes051075a2012-04-28 17:39:37 -0400107 instance = self.get_resource('instance')
108 instance_id = instance.id
109 LOG.debug("Pausing instance %s. Current status: %s",
110 instance_id, instance.status)
111 instance.pause()
Sean Dague35a7caf2013-05-10 10:38:22 -0400112 self.status_timeout(
113 self.compute_client.servers, instance_id, 'PAUSED')
Jay Pipes051075a2012-04-28 17:39:37 -0400114
ivan-zhu19977392013-01-12 21:57:55 +0800115 def unpause_server(self):
Jay Pipes051075a2012-04-28 17:39:37 -0400116 instance = self.get_resource('instance')
117 instance_id = instance.id
118 LOG.debug("Unpausing instance %s. Current status: %s",
119 instance_id, instance.status)
120 instance.unpause()
Sean Dague35a7caf2013-05-10 10:38:22 -0400121 self.status_timeout(
122 self.compute_client.servers, instance_id, 'ACTIVE')
Jay Pipes051075a2012-04-28 17:39:37 -0400123
ivan-zhu19977392013-01-12 21:57:55 +0800124 def suspend_server(self):
Jay Pipes051075a2012-04-28 17:39:37 -0400125 instance = self.get_resource('instance')
126 instance_id = instance.id
127 LOG.debug("Suspending instance %s. Current status: %s",
128 instance_id, instance.status)
129 instance.suspend()
Sean Dague35a7caf2013-05-10 10:38:22 -0400130 self.status_timeout(self.compute_client.servers,
Maru Newbydec13ec2012-08-30 11:19:17 -0700131 instance_id, 'SUSPENDED')
Jay Pipes051075a2012-04-28 17:39:37 -0400132
ivan-zhu19977392013-01-12 21:57:55 +0800133 def resume_server(self):
Jay Pipes051075a2012-04-28 17:39:37 -0400134 instance = self.get_resource('instance')
135 instance_id = instance.id
136 LOG.debug("Resuming instance %s. Current status: %s",
137 instance_id, instance.status)
138 instance.resume()
Sean Dague35a7caf2013-05-10 10:38:22 -0400139 self.status_timeout(
140 self.compute_client.servers, instance_id, 'ACTIVE')
Jay Pipes051075a2012-04-28 17:39:37 -0400141
ivan-zhu19977392013-01-12 21:57:55 +0800142 def terminate_instance(self):
Jay Pipes051075a2012-04-28 17:39:37 -0400143 instance = self.get_resource('instance')
144 instance.delete()
145 self.remove_resource('instance')
ivan-zhu19977392013-01-12 21:57:55 +0800146
Andrea Frittolif5da28b2013-12-06 07:08:07 +0000147 def verify_ssh(self):
148 if self.run_ssh:
149 # Obtain a floating IP
150 floating_ip = self.compute_client.floating_ips.create()
151 # Attach a floating IP
152 instance = self.get_resource('instance')
153 instance.add_floating_ip(floating_ip)
154 # Check ssh
Nachi Ueno95b41282014-01-15 06:54:21 -0800155 try:
156 self.get_remote_client(
157 server_or_ip=floating_ip.ip,
158 username=self.image_utils.ssh_user(self.image_ref),
159 private_key=self.keypair.private)
160 except Exception:
161 LOG.exception('ssh to server failed')
162 self._log_console_output()
163 raise
Andrea Frittolif5da28b2013-12-06 07:08:07 +0000164
Matthew Treinish2153ec02013-09-09 20:57:30 +0000165 @services('compute', 'network')
ivan-zhu19977392013-01-12 21:57:55 +0800166 def test_server_basicops(self):
Ken'ichi Ohmichi599d1b82013-08-19 18:48:37 +0900167 self.add_keypair()
ivan-zhu19977392013-01-12 21:57:55 +0800168 self.create_security_group()
169 self.boot_instance()
ivan-zhu19977392013-01-12 21:57:55 +0800170 self.pause_server()
171 self.unpause_server()
172 self.suspend_server()
173 self.resume_server()
Andrea Frittolif5da28b2013-12-06 07:08:07 +0000174 self.verify_ssh()
ivan-zhu19977392013-01-12 21:57:55 +0800175 self.terminate_instance()