blob: c66128db49ee7aba6dc16073728924b9fc2843eb [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
Alexander Gubanov509e2842015-06-09 15:29:51 +030016import json
Alexander Gubanovdac47382016-06-24 16:49:36 +030017import re
Alexander Gubanov509e2842015-06-09 15:29:51 +030018
Matthew Treinish6c072292014-01-29 19:15:52 +000019from tempest import config
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030020from tempest import exceptions
Jordan Pittier35a63752016-08-30 13:09:12 +020021from tempest.lib.common.utils import test_utils
Sean Dague6dbc6da2013-05-08 17:49:46 -040022from tempest.scenario import manager
Masayuki Igawa4ded9f02014-02-17 15:05:59 +090023from tempest import test
Jay Pipes051075a2012-04-28 17:39:37 -040024
Matthew Treinish6c072292014-01-29 19:15:52 +000025CONF = config.CONF
26
Jay Pipes051075a2012-04-28 17:39:37 -040027
Ghanshyam5a305c42014-08-27 14:24:58 +090028class TestServerBasicOps(manager.ScenarioTest):
Jay Pipes051075a2012-04-28 17:39:37 -040029
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000030 """The test suite for server basic operations
Jay Pipes051075a2012-04-28 17:39:37 -040031
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000032 This smoke test case follows this basic set of operations:
Jay Pipes051075a2012-04-28 17:39:37 -040033 * Create a keypair for use in launching an instance
34 * Create a security group to control network access in instance
35 * Add simple permissive rules to the security group
36 * Launch an instance
ghanshyam416c94c2014-10-02 13:47:25 +090037 * Perform ssh to instance
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090038 * Verify metadata service
Alexander Gubanov509e2842015-06-09 15:29:51 +030039 * Verify metadata on config_drive
Jay Pipes051075a2012-04-28 17:39:37 -040040 * Terminate the instance
41 """
42
Andrea Frittolif5da28b2013-12-06 07:08:07 +000043 def setUp(self):
44 super(TestServerBasicOps, self).setUp()
Matthew Treinishf2c45012016-06-22 21:13:42 -040045 self.image_ref = CONF.compute.image_ref
46 self.flavor_ref = CONF.compute.flavor_ref
47 self.run_ssh = CONF.validation.run_validation
48 self.ssh_user = CONF.validation.image_ssh_user
Andrea Frittolif5da28b2013-12-06 07:08:07 +000049
Jordan Pittierbbb17122016-01-26 17:10:55 +010050 def verify_ssh(self, keypair):
Andrea Frittolif5da28b2013-12-06 07:08:07 +000051 if self.run_ssh:
52 # Obtain a floating IP
Alexander Gubanov2388e2a2015-11-07 11:16:28 +020053 self.fip = self.create_floating_ip(self.instance)['ip']
Andrea Frittolif5da28b2013-12-06 07:08:07 +000054 # Check ssh
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090055 self.ssh_client = self.get_remote_client(
Sean Dague20e98612016-01-06 14:33:28 -050056 ip_address=self.fip,
YAMAMOTO Takashi42189bf2016-06-24 16:02:53 +090057 username=self.ssh_user,
Jordan Pittierbbb17122016-01-26 17:10:55 +010058 private_key=keypair['private_key'])
Andrea Frittolif5da28b2013-12-06 07:08:07 +000059
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090060 def verify_metadata(self):
61 if self.run_ssh and CONF.compute_feature_enabled.metadata_service:
62 # Verify metadata service
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030063 md_url = 'http://169.254.169.254/latest/meta-data/public-ipv4'
64
65 def exec_cmd_and_verify_output():
66 cmd = 'curl ' + md_url
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030067 result = self.ssh_client.exec_command(cmd)
68 if result:
69 msg = ('Failed while verifying metadata on server. Result '
Alexander Gubanov2388e2a2015-11-07 11:16:28 +020070 'of command "%s" is NOT "%s".' % (cmd, self.fip))
71 self.assertEqual(self.fip, result, msg)
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030072 return 'Verification is successful!'
73
Jordan Pittier35a63752016-08-30 13:09:12 +020074 if not test_utils.call_until_true(exec_cmd_and_verify_output,
75 CONF.compute.build_timeout,
76 CONF.compute.build_interval):
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030077 raise exceptions.TimeoutException('Timed out while waiting to '
78 'verify metadata on server. '
79 '%s is empty.' % md_url)
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090080
Clark Boylandf73bdf2016-07-06 09:55:28 -070081 def _mount_config_drive(self):
82 cmd_blkid = 'blkid | grep -i config-2'
83 result = self.ssh_client.exec_command(cmd_blkid)
84 dev_name = re.match('([^:]+)', result).group()
85 self.ssh_client.exec_command('sudo mount %s /mnt' % dev_name)
86
87 def _unmount_config_drive(self):
88 self.ssh_client.exec_command('sudo umount /mnt')
89
Alexander Gubanov509e2842015-06-09 15:29:51 +030090 def verify_metadata_on_config_drive(self):
91 if self.run_ssh and CONF.compute_feature_enabled.config_drive:
92 # Verify metadata on config_drive
Clark Boylandf73bdf2016-07-06 09:55:28 -070093 self._mount_config_drive()
Alexander Gubanov509e2842015-06-09 15:29:51 +030094 cmd_md = 'sudo cat /mnt/openstack/latest/meta_data.json'
95 result = self.ssh_client.exec_command(cmd_md)
Clark Boylandf73bdf2016-07-06 09:55:28 -070096 self._unmount_config_drive()
Alexander Gubanov509e2842015-06-09 15:29:51 +030097 result = json.loads(result)
98 self.assertIn('meta', result)
99 msg = ('Failed while verifying metadata on config_drive on server.'
100 ' Result of command "%s" is NOT "%s".' % (cmd_md, self.md))
101 self.assertEqual(self.md, result['meta'], msg)
102
Clark Boylandf73bdf2016-07-06 09:55:28 -0700103 def verify_networkdata_on_config_drive(self):
104 if self.run_ssh and CONF.compute_feature_enabled.config_drive:
105 # Verify network data on config_drive
106 self._mount_config_drive()
107 cmd_md = 'sudo cat /mnt/openstack/latest/network_data.json'
108 result = self.ssh_client.exec_command(cmd_md)
109 self._unmount_config_drive()
110 result = json.loads(result)
111 self.assertIn('services', result)
112 self.assertIn('links', result)
113 self.assertIn('networks', result)
114 # TODO(clarkb) construct network_data from known network
115 # instance info and do direct comparison.
116
Chris Hoge7579c1a2015-02-26 14:12:15 -0800117 @test.idempotent_id('7fff3fb3-91d8-4fd0-bd7d-0204f1f180ba')
Sean Dague3c634d12015-04-27 12:09:19 -0400118 @test.attr(type='smoke')
Masayuki Igawa4ded9f02014-02-17 15:05:59 +0900119 @test.services('compute', 'network')
Tong Liu9bee3b92016-03-23 23:53:43 +0000120 def test_server_basic_ops(self):
Jordan Pittierbbb17122016-01-26 17:10:55 +0100121 keypair = self.create_keypair()
Jordan Pittier56c125e2016-09-16 16:20:22 +0200122 security_group = self._create_security_group()
lanoux5fc14522015-09-21 08:17:35 +0000123 self.md = {'meta1': 'data1', 'meta2': 'data2', 'metaN': 'dataN'}
124 self.instance = self.create_server(
125 image_id=self.image_ref,
126 flavor=self.flavor_ref,
Jordan Pittierbbb17122016-01-26 17:10:55 +0100127 key_name=keypair['name'],
Jordan Pittier56c125e2016-09-16 16:20:22 +0200128 security_groups=[{'name': security_group['name']}],
lanoux5fc14522015-09-21 08:17:35 +0000129 config_drive=CONF.compute_feature_enabled.config_drive,
130 metadata=self.md,
131 wait_until='ACTIVE')
Jordan Pittierbbb17122016-01-26 17:10:55 +0100132 self.verify_ssh(keypair)
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +0900133 self.verify_metadata()
Alexander Gubanov509e2842015-06-09 15:29:51 +0300134 self.verify_metadata_on_config_drive()
Clark Boylandf73bdf2016-07-06 09:55:28 -0700135 self.verify_networkdata_on_config_drive()
Ghanshyam5a305c42014-08-27 14:24:58 +0900136 self.servers_client.delete_server(self.instance['id'])