blob: 3830fbc888b2488c8be6f34335bfcf26627508d8 [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
zhulingjie92b87a52019-02-21 01:05:54 +080016from oslo_serialization import jsonutils as json
Alexander Gubanov509e2842015-06-09 15:29:51 +030017
Andrea Frittolicd368412017-08-14 21:37:56 +010018from tempest.common import utils
zhufl44fce682016-11-23 15:37:49 +080019from tempest.common import waiters
Matthew Treinish6c072292014-01-29 19:15:52 +000020from tempest import config
YAMAMOTO Takashid5f7e232017-01-16 12:31:59 +090021from tempest.lib.common.utils import data_utils
Jordan Pittier35a63752016-08-30 13:09:12 +020022from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -080023from tempest.lib import decorators
guo yunxian7383a6f2016-12-05 18:56:51 +080024from tempest.lib import exceptions
Sean Dague6dbc6da2013-05-08 17:49:46 -040025from tempest.scenario import manager
Jay Pipes051075a2012-04-28 17:39:37 -040026
Matthew Treinish6c072292014-01-29 19:15:52 +000027CONF = config.CONF
28
Jay Pipes051075a2012-04-28 17:39:37 -040029
Ghanshyam5a305c42014-08-27 14:24:58 +090030class TestServerBasicOps(manager.ScenarioTest):
Jay Pipes051075a2012-04-28 17:39:37 -040031
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000032 """The test suite for server basic operations
Jay Pipes051075a2012-04-28 17:39:37 -040033
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000034 This smoke test case follows this basic set of operations:
Jay Pipes051075a2012-04-28 17:39:37 -040035 * Create a keypair for use in launching an instance
36 * Create a security group to control network access in instance
37 * Add simple permissive rules to the security group
38 * Launch an instance
ghanshyam416c94c2014-10-02 13:47:25 +090039 * Perform ssh to instance
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090040 * Verify metadata service
Alexander Gubanov509e2842015-06-09 15:29:51 +030041 * Verify metadata on config_drive
Jay Pipes051075a2012-04-28 17:39:37 -040042 * Terminate the instance
43 """
44
Andrea Frittolif5da28b2013-12-06 07:08:07 +000045 def setUp(self):
46 super(TestServerBasicOps, self).setUp()
Matthew Treinishf2c45012016-06-22 21:13:42 -040047 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:
Roman Popelka86b8b622023-05-29 12:06:51 +020052 # Obtain server IP
53 self.ip = self.get_server_ip(self.instance)
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(
zhufl1bdc3e72018-01-10 14:10:47 +080056 ip_address=self.ip,
YAMAMOTO Takashi42189bf2016-06-24 16:02:53 +090057 username=self.ssh_user,
zhuflf52c7592017-05-25 13:55:24 +080058 private_key=keypair['private_key'],
59 server=self.instance)
Andrea Frittolif5da28b2013-12-06 07:08:07 +000060
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090061 def verify_metadata(self):
62 if self.run_ssh and CONF.compute_feature_enabled.metadata_service:
63 # Verify metadata service
Deepanshu Bhatia46008422021-01-18 04:24:29 +053064 if CONF.network.public_network_id:
65 md_url = 'http://169.254.169.254/latest/meta-data/public-ipv4'
66 else:
67 md_url = 'http://169.254.169.254/latest/meta-data/local-ipv4'
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030068
69 def exec_cmd_and_verify_output():
70 cmd = 'curl ' + md_url
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030071 result = self.ssh_client.exec_command(cmd)
72 if result:
73 msg = ('Failed while verifying metadata on server. Result '
zhufl1bdc3e72018-01-10 14:10:47 +080074 'of command "%s" is NOT "%s".' % (cmd, self.ip))
75 self.assertEqual(self.ip, result, msg)
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030076 return 'Verification is successful!'
77
Jordan Pittier35a63752016-08-30 13:09:12 +020078 if not test_utils.call_until_true(exec_cmd_and_verify_output,
79 CONF.compute.build_timeout,
80 CONF.compute.build_interval):
Yaroslav Lobankov117a48f2015-08-11 11:40:44 +030081 raise exceptions.TimeoutException('Timed out while waiting to '
82 'verify metadata on server. '
83 '%s is empty.' % md_url)
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +090084
YAMAMOTO Takashid5f7e232017-01-16 12:31:59 +090085 # Also, test a POST
86 md_url = 'http://169.254.169.254/openstack/2013-10-17/password'
87 data = data_utils.arbitrary_string(100)
88 cmd = 'curl -X POST -d ' + data + ' ' + md_url
89 self.ssh_client.exec_command(cmd)
90 result = self.servers_client.show_password(self.instance['id'])
91 self.assertEqual(data, result['password'])
92
Alexander Gubanov509e2842015-06-09 15:29:51 +030093 def verify_metadata_on_config_drive(self):
94 if self.run_ssh and CONF.compute_feature_enabled.config_drive:
95 # Verify metadata on config_drive
Mohammed Naserb6c6d2a2017-12-29 18:13:29 -050096 self.ssh_client.mount_config_drive()
Alexander Gubanov509e2842015-06-09 15:29:51 +030097 cmd_md = 'sudo cat /mnt/openstack/latest/meta_data.json'
98 result = self.ssh_client.exec_command(cmd_md)
Mohammed Naserb6c6d2a2017-12-29 18:13:29 -050099 self.ssh_client.unmount_config_drive()
Alexander Gubanov509e2842015-06-09 15:29:51 +0300100 result = json.loads(result)
101 self.assertIn('meta', result)
102 msg = ('Failed while verifying metadata on config_drive on server.'
103 ' Result of command "%s" is NOT "%s".' % (cmd_md, self.md))
104 self.assertEqual(self.md, result['meta'], msg)
105
Clark Boylandf73bdf2016-07-06 09:55:28 -0700106 def verify_networkdata_on_config_drive(self):
107 if self.run_ssh and CONF.compute_feature_enabled.config_drive:
108 # Verify network data on config_drive
Mohammed Naserb6c6d2a2017-12-29 18:13:29 -0500109 self.ssh_client.mount_config_drive()
Clark Boylandf73bdf2016-07-06 09:55:28 -0700110 cmd_md = 'sudo cat /mnt/openstack/latest/network_data.json'
111 result = self.ssh_client.exec_command(cmd_md)
Mohammed Naserb6c6d2a2017-12-29 18:13:29 -0500112 self.ssh_client.unmount_config_drive()
Clark Boylandf73bdf2016-07-06 09:55:28 -0700113 result = json.loads(result)
114 self.assertIn('services', result)
115 self.assertIn('links', result)
116 self.assertIn('networks', result)
117 # TODO(clarkb) construct network_data from known network
118 # instance info and do direct comparison.
119
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800120 @decorators.idempotent_id('7fff3fb3-91d8-4fd0-bd7d-0204f1f180ba')
Jordan Pittier3b46d272017-04-12 16:17:28 +0200121 @decorators.attr(type='smoke')
Andrea Frittolicd368412017-08-14 21:37:56 +0100122 @utils.services('compute', 'network')
Tong Liu9bee3b92016-03-23 23:53:43 +0000123 def test_server_basic_ops(self):
Jordan Pittierbbb17122016-01-26 17:10:55 +0100124 keypair = self.create_keypair()
Soniya Vyas582c1702021-02-22 18:26:17 +0530125 security_group = self.create_security_group()
lanoux5fc14522015-09-21 08:17:35 +0000126 self.md = {'meta1': 'data1', 'meta2': 'data2', 'metaN': 'dataN'}
127 self.instance = self.create_server(
Dan Smith49c2b3b2023-04-26 15:52:22 -0700128 keypair=keypair,
129 wait_until='SSHABLE',
Jordan Pittier56c125e2016-09-16 16:20:22 +0200130 security_groups=[{'name': security_group['name']}],
lanoux5fc14522015-09-21 08:17:35 +0000131 config_drive=CONF.compute_feature_enabled.config_drive,
zhufl13c9c892017-02-10 12:04:07 +0800132 metadata=self.md)
Jordan Pittierbbb17122016-01-26 17:10:55 +0100133 self.verify_ssh(keypair)
YAMAMOTO Takashi1f62af22015-06-16 03:29:50 +0900134 self.verify_metadata()
Alexander Gubanov509e2842015-06-09 15:29:51 +0300135 self.verify_metadata_on_config_drive()
Clark Boylandf73bdf2016-07-06 09:55:28 -0700136 self.verify_networkdata_on_config_drive()
Ghanshyam5a305c42014-08-27 14:24:58 +0900137 self.servers_client.delete_server(self.instance['id'])
zhufl44fce682016-11-23 15:37:49 +0800138 waiters.wait_for_server_termination(
139 self.servers_client, self.instance['id'], ignore_error=False)