blob: bd49fb266e5958a5e620dca3c8a1406b8e8ae722 [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
Andrea Frittoli50bb80d2014-09-15 12:34:27 +010035 def resource_setup(cls):
36 super(ServersAdminNegativeTestJSON, cls).resource_setup()
huangtianhua5232b662013-10-11 10:21:58 +080037 cls.client = cls.os_adm.servers_client
38 cls.non_adm_client = cls.servers_client
39 cls.flavors_client = cls.os_adm.flavors_client
Andrea Frittoli9612e812014-03-13 10:57:26 +000040 cls.tenant_id = cls.client.tenant_id
huangtianhua5232b662013-10-11 10:21:58 +080041
42 cls.s1_name = data_utils.rand_name('server')
43 resp, server = cls.create_test_server(name=cls.s1_name,
44 wait_until='ACTIVE')
45 cls.s1_id = server['id']
46
47 def _get_unused_flavor_id(self):
48 flavor_id = data_utils.rand_int_id(start=1000)
49 while True:
50 try:
51 resp, body = self.flavors_client.get_flavor_details(flavor_id)
52 except exceptions.NotFound:
53 break
54 flavor_id = data_utils.rand_int_id(start=1000)
55 return flavor_id
56
Joseph Lanouxb3d956f2014-06-25 14:45:24 +000057 @testtools.skipUnless(CONF.compute_feature_enabled.resize,
58 'Resize not available.')
Masayuki Igawa394d8d92014-03-04 17:21:56 +090059 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +080060 def test_resize_server_using_overlimit_ram(self):
61 flavor_name = data_utils.rand_name("flavor-")
62 flavor_id = self._get_unused_flavor_id()
63 resp, quota_set = self.quotas_client.get_default_quota_set(
64 self.tenant_id)
65 ram = int(quota_set['ram']) + 1
66 vcpus = 8
67 disk = 10
68 resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
69 ram, vcpus, disk,
70 flavor_id)
71 self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
ZHU ZHU35762542014-09-01 01:58:49 -050072 self.assertRaises((exceptions.Unauthorized, exceptions.OverLimit),
huangtianhua5232b662013-10-11 10:21:58 +080073 self.client.resize,
74 self.servers[0]['id'],
75 flavor_ref['id'])
76
Joseph Lanouxb3d956f2014-06-25 14:45:24 +000077 @testtools.skipUnless(CONF.compute_feature_enabled.resize,
78 'Resize not available.')
Masayuki Igawa394d8d92014-03-04 17:21:56 +090079 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +080080 def test_resize_server_using_overlimit_vcpus(self):
81 flavor_name = data_utils.rand_name("flavor-")
82 flavor_id = self._get_unused_flavor_id()
83 ram = 512
84 resp, quota_set = self.quotas_client.get_default_quota_set(
85 self.tenant_id)
86 vcpus = int(quota_set['cores']) + 1
87 disk = 10
88 resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
89 ram, vcpus, disk,
90 flavor_id)
91 self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
ZHU ZHU35762542014-09-01 01:58:49 -050092 self.assertRaises((exceptions.Unauthorized, exceptions.OverLimit),
huangtianhua5232b662013-10-11 10:21:58 +080093 self.client.resize,
94 self.servers[0]['id'],
95 flavor_ref['id'])
96
Masayuki Igawa394d8d92014-03-04 17:21:56 +090097 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +080098 def test_reset_state_server_invalid_state(self):
99 self.assertRaises(exceptions.BadRequest,
100 self.client.reset_state, self.s1_id,
101 state='invalid')
102
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900103 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800104 def test_reset_state_server_invalid_type(self):
105 self.assertRaises(exceptions.BadRequest,
106 self.client.reset_state, self.s1_id,
107 state=1)
108
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900109 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800110 def test_reset_state_server_nonexistent_server(self):
111 self.assertRaises(exceptions.NotFound,
112 self.client.reset_state, '999')
113
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900114 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800115 def test_get_server_diagnostics_by_non_admin(self):
116 # Non-admin user can not view server diagnostics according to policy
117 self.assertRaises(exceptions.Unauthorized,
118 self.non_adm_client.get_server_diagnostics,
119 self.s1_id)
120
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900121 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800122 def test_migrate_non_existent_server(self):
123 # migrate a non existent server
124 self.assertRaises(exceptions.NotFound,
125 self.client.migrate_server,
126 str(uuid.uuid4()))
127
Andrea Rosa3df237c2014-07-18 14:22:53 +0100128 @testtools.skipUnless(CONF.compute_feature_enabled.resize,
129 'Resize not available.')
Matt Riedemann7051d622014-03-23 18:36:17 -0700130 @testtools.skipUnless(CONF.compute_feature_enabled.suspend,
131 'Suspend is not available.')
Masayuki Igawa394d8d92014-03-04 17:21:56 +0900132 @test.attr(type=['negative', 'gate'])
huangtianhua5232b662013-10-11 10:21:58 +0800133 def test_migrate_server_invalid_state(self):
134 # create server.
135 resp, server = self.create_test_server(wait_until='ACTIVE')
136 self.assertEqual(202, resp.status)
137 server_id = server['id']
138 # suspend the server.
139 resp, _ = self.client.suspend_server(server_id)
140 self.assertEqual(202, resp.status)
141 self.client.wait_for_server_status(server_id, 'SUSPENDED')
142 # migrate an suspended server should fail
143 self.assertRaises(exceptions.Conflict,
144 self.client.migrate_server,
145 server_id)
146
147
148class ServersAdminNegativeTestXML(ServersAdminNegativeTestJSON):
149 _interface = 'xml'