blob: 9fa07f6698bc341f5e13c7cc8ec6e6bcfc277ffe [file] [log] [blame]
huangtianhua5232b662013-10-11 10:21:58 +08001# Copyright 2013 Huawei Technologies Co.,LTD.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
15import uuid
16
Matt Riedemann7051d622014-03-23 18:36:17 -070017import testtools
18
huangtianhua5232b662013-10-11 10:21:58 +080019from tempest.api.compute import base
20from tempest.common.utils import data_utils
Matt Riedemann7051d622014-03-23 18:36:17 -070021from tempest import config
huangtianhua5232b662013-10-11 10:21:58 +080022from tempest import exceptions
Masayuki Igawa394d8d92014-03-04 17:21:56 +090023from tempest import test
huangtianhua5232b662013-10-11 10:21:58 +080024
Matt Riedemann7051d622014-03-23 18:36:17 -070025CONF = config.CONF
26
huangtianhua5232b662013-10-11 10:21:58 +080027
28class ServersAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
29
30 """
31 Tests Servers API using admin privileges
32 """
33
huangtianhua5232b662013-10-11 10:21:58 +080034 @classmethod
35 def setUpClass(cls):
36 super(ServersAdminNegativeTestJSON, cls).setUpClass()
37 cls.client = cls.os_adm.servers_client
38 cls.non_adm_client = cls.servers_client
39 cls.flavors_client = cls.os_adm.flavors_client
40 cls.identity_client = cls._get_identity_admin_client()
41 tenant = cls.identity_client.get_tenant_by_name(
42 cls.client.tenant_name)
43 cls.tenant_id = tenant['id']
44
45 cls.s1_name = data_utils.rand_name('server')
46 resp, server = cls.create_test_server(name=cls.s1_name,
47 wait_until='ACTIVE')
48 cls.s1_id = server['id']
49
50 def _get_unused_flavor_id(self):
51 flavor_id = data_utils.rand_int_id(start=1000)
52 while True:
53 try:
54 resp, body = self.flavors_client.get_flavor_details(flavor_id)
55 except exceptions.NotFound:
56 break
57 flavor_id = data_utils.rand_int_id(start=1000)
58 return flavor_id
59
Masayuki Igawa394d8d92014-03-04 17:21:56 +090060 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +080061 def test_resize_server_using_overlimit_ram(self):
62 flavor_name = data_utils.rand_name("flavor-")
63 flavor_id = self._get_unused_flavor_id()
64 resp, quota_set = self.quotas_client.get_default_quota_set(
65 self.tenant_id)
66 ram = int(quota_set['ram']) + 1
67 vcpus = 8
68 disk = 10
69 resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
70 ram, vcpus, disk,
71 flavor_id)
72 self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
73 self.assertRaises(exceptions.OverLimit,
74 self.client.resize,
75 self.servers[0]['id'],
76 flavor_ref['id'])
77
Masayuki Igawa394d8d92014-03-04 17:21:56 +090078 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +080079 def test_resize_server_using_overlimit_vcpus(self):
80 flavor_name = data_utils.rand_name("flavor-")
81 flavor_id = self._get_unused_flavor_id()
82 ram = 512
83 resp, quota_set = self.quotas_client.get_default_quota_set(
84 self.tenant_id)
85 vcpus = int(quota_set['cores']) + 1
86 disk = 10
87 resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
88 ram, vcpus, disk,
89 flavor_id)
90 self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
91 self.assertRaises(exceptions.OverLimit,
92 self.client.resize,
93 self.servers[0]['id'],
94 flavor_ref['id'])
95
Masayuki Igawa394d8d92014-03-04 17:21:56 +090096 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +080097 def test_reset_state_server_invalid_state(self):
98 self.assertRaises(exceptions.BadRequest,
99 self.client.reset_state, self.s1_id,
100 state='invalid')
101
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900102 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800103 def test_reset_state_server_invalid_type(self):
104 self.assertRaises(exceptions.BadRequest,
105 self.client.reset_state, self.s1_id,
106 state=1)
107
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900108 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800109 def test_reset_state_server_nonexistent_server(self):
110 self.assertRaises(exceptions.NotFound,
111 self.client.reset_state, '999')
112
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900113 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800114 def test_get_server_diagnostics_by_non_admin(self):
115 # Non-admin user can not view server diagnostics according to policy
116 self.assertRaises(exceptions.Unauthorized,
117 self.non_adm_client.get_server_diagnostics,
118 self.s1_id)
119
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900120 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800121 def test_migrate_non_existent_server(self):
122 # migrate a non existent server
123 self.assertRaises(exceptions.NotFound,
124 self.client.migrate_server,
125 str(uuid.uuid4()))
126
Matt Riedemann7051d622014-03-23 18:36:17 -0700127 @testtools.skipUnless(CONF.compute_feature_enabled.suspend,
128 'Suspend is not available.')
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900129 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800130 def test_migrate_server_invalid_state(self):
131 # create server.
132 resp, server = self.create_test_server(wait_until='ACTIVE')
133 self.assertEqual(202, resp.status)
134 server_id = server['id']
135 # suspend the server.
136 resp, _ = self.client.suspend_server(server_id)
137 self.assertEqual(202, resp.status)
138 self.client.wait_for_server_status(server_id, 'SUSPENDED')
139 # migrate an suspended server should fail
140 self.assertRaises(exceptions.Conflict,
141 self.client.migrate_server,
142 server_id)
143
144
145class ServersAdminNegativeTestXML(ServersAdminNegativeTestJSON):
146 _interface = 'xml'