blob: ebc661cdeed3641a80390fb86380e1b1a3fd41c0 [file] [log] [blame]
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +08001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2013 IBM Corp.
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
16
17from tempest.api.compute import base
Zhi Kun Liu3c44af32013-09-02 23:34:57 +080018from tempest.common.utils.data_utils import rand_int_id
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080019from tempest.common.utils.data_utils import rand_name
Zhi Kun Liu3c44af32013-09-02 23:34:57 +080020from tempest import exceptions
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080021from tempest.test import attr
Bob Ball826301d2013-10-12 22:24:38 +010022from tempest.test import skip_because
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080023
24
ivan-zhuf2b00502013-10-18 10:06:52 +080025class ServersAdminTestJSON(base.BaseV2ComputeAdminTest):
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080026
27 """
28 Tests Servers API using admin privileges
29 """
30
31 _interface = 'json'
32
33 @classmethod
34 def setUpClass(cls):
35 super(ServersAdminTestJSON, cls).setUpClass()
36 cls.client = cls.os_adm.servers_client
Zhu Zhuda070852013-09-25 08:07:57 -050037 cls.non_adm_client = cls.servers_client
38 cls.flavors_client = cls.os_adm.flavors_client
Zhu Zhuda070852013-09-25 08:07:57 -050039 cls.identity_client = cls._get_identity_admin_client()
40 tenant = cls.identity_client.get_tenant_by_name(
Zhi Kun Liu3c44af32013-09-02 23:34:57 +080041 cls.client.tenant_name)
42 cls.tenant_id = tenant['id']
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080043
44 cls.s1_name = rand_name('server')
45 resp, server = cls.create_server(name=cls.s1_name,
46 wait_until='ACTIVE')
LingxianKongc26e6072013-09-28 21:16:52 +080047 cls.s1_id = server['id']
48
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080049 cls.s2_name = rand_name('server')
50 resp, server = cls.create_server(name=cls.s2_name,
51 wait_until='ACTIVE')
52
Zhi Kun Liu3c44af32013-09-02 23:34:57 +080053 def _get_unused_flavor_id(self):
54 flavor_id = rand_int_id(start=1000)
55 while True:
56 try:
57 resp, body = self.flavors_client.get_flavor_details(flavor_id)
58 except exceptions.NotFound:
59 break
60 flavor_id = rand_int_id(start=1000)
61 return flavor_id
62
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080063 @attr(type='gate')
64 def test_list_servers_by_admin(self):
65 # Listing servers by admin user returns empty list by default
66 resp, body = self.client.list_servers_with_detail()
67 servers = body['servers']
68 self.assertEqual('200', resp['status'])
69 self.assertEqual([], servers)
70
71 @attr(type='gate')
72 def test_list_servers_by_admin_with_all_tenants(self):
73 # Listing servers by admin user with all tenants parameter
74 # Here should be listed all servers
75 params = {'all_tenants': ''}
76 resp, body = self.client.list_servers_with_detail(params)
77 servers = body['servers']
78 servers_name = map(lambda x: x['name'], servers)
79
80 self.assertIn(self.s1_name, servers_name)
81 self.assertIn(self.s2_name, servers_name)
82
Jinhe Fang03fc10f2013-09-30 10:49:44 +080083 @attr(type='gate')
84 def test_admin_delete_servers_of_others(self):
85 # Administrator can delete servers of others
86 _, server = self.create_server()
87 resp, _ = self.client.delete_server(server['id'])
88 self.assertEqual('204', resp['status'])
89 self.servers_client.wait_for_server_termination(server['id'])
90
Zhi Kun Liu3c44af32013-09-02 23:34:57 +080091 @attr(type=['negative', 'gate'])
92 def test_resize_server_using_overlimit_ram(self):
93 flavor_name = rand_name("flavor-")
94 flavor_id = self._get_unused_flavor_id()
95 resp, quota_set = self.quotas_client.get_default_quota_set(
96 self.tenant_id)
97 ram = int(quota_set['ram']) + 1
98 vcpus = 8
99 disk = 10
100 resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
101 ram, vcpus, disk,
102 flavor_id)
103 self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
104 self.assertRaises(exceptions.OverLimit,
105 self.client.resize,
106 self.servers[0]['id'],
107 flavor_ref['id'])
108
109 @attr(type=['negative', 'gate'])
110 def test_resize_server_using_overlimit_vcpus(self):
111 flavor_name = rand_name("flavor-")
112 flavor_id = self._get_unused_flavor_id()
113 ram = 512
114 resp, quota_set = self.quotas_client.get_default_quota_set(
115 self.tenant_id)
116 vcpus = int(quota_set['cores']) + 1
117 disk = 10
118 resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
119 ram, vcpus, disk,
120 flavor_id)
121 self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
122 self.assertRaises(exceptions.OverLimit,
123 self.client.resize,
124 self.servers[0]['id'],
125 flavor_ref['id'])
126
LingxianKongc26e6072013-09-28 21:16:52 +0800127 @attr(type='gate')
128 def test_reset_state_server(self):
129 # Reset server's state to 'error'
130 resp, server = self.client.reset_state(self.s1_id)
131 self.assertEqual(202, resp.status)
132
133 # Verify server's state
134 resp, server = self.client.get_server(self.s1_id)
135 self.assertEqual(server['status'], 'ERROR')
136
137 # Reset server's state to 'active'
138 resp, server = self.client.reset_state(self.s1_id, state='active')
139 self.assertEqual(202, resp.status)
140
141 # Verify server's state
142 resp, server = self.client.get_server(self.s1_id)
143 self.assertEqual(server['status'], 'ACTIVE')
144
145 @attr(type=['negative', 'gate'])
146 def test_reset_state_server_invalid_state(self):
147 self.assertRaises(exceptions.BadRequest,
148 self.client.reset_state, self.s1_id,
149 state='invalid')
150
151 @attr(type=['negative', 'gate'])
152 def test_reset_state_server_invalid_type(self):
153 self.assertRaises(exceptions.BadRequest,
154 self.client.reset_state, self.s1_id,
155 state=1)
156
157 @attr(type=['negative', 'gate'])
158 def test_reset_state_server_nonexistent_server(self):
159 self.assertRaises(exceptions.NotFound,
160 self.client.reset_state, '999')
161
Zhu Zhuda070852013-09-25 08:07:57 -0500162 @attr(type='gate')
Bob Ball826301d2013-10-12 22:24:38 +0100163 @skip_because(bug="1240043")
Zhu Zhuda070852013-09-25 08:07:57 -0500164 def test_get_server_diagnostics_by_admin(self):
165 # Retrieve server diagnostics by admin user
166 resp, diagnostic = self.client.get_server_diagnostics(self.s1_id)
167 self.assertEqual(200, resp.status)
168 basic_attrs = ['rx_packets', 'rx_errors', 'rx_drop',
169 'tx_packets', 'tx_errors', 'tx_drop',
170 'read_req', 'write_req', 'cpu', 'memory']
171 for key in basic_attrs:
172 self.assertIn(key, str(diagnostic.keys()))
173
174 @attr(type=['negative', 'gate'])
175 def test_get_server_diagnostics_by_non_admin(self):
176 # Non-admin user can not view server diagnostics according to policy
177 self.assertRaises(exceptions.Unauthorized,
178 self.non_adm_client.get_server_diagnostics,
179 self.s1_id)
180
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +0800181
182class ServersAdminTestXML(ServersAdminTestJSON):
183 _interface = 'xml'