blob: 97fbd8b07366801a17d75aaafa7ce6db36e80b5f [file] [log] [blame]
Jay Pipes13b479b2012-06-11 14:52:27 -04001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2012 OpenStack, LLC
Jay Pipes13b479b2012-06-11 14:52:27 -04004#
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
Sean Dague1937d092013-05-17 16:36:38 -040017from tempest.api import compute
18from tempest.api.compute import base
Matthew Treinish481466b2012-12-20 17:16:01 -050019from tempest import clients
Matthew Treinisha83a16e2012-12-07 13:44:02 -050020from tempest.common.utils.data_utils import parse_image_id
21from tempest.common.utils.data_utils import rand_name
Jay Pipes13b479b2012-06-11 14:52:27 -040022from tempest import exceptions
Chris Yeoh9465b0b2013-02-09 22:19:15 +103023from tempest.test import attr
Jay Pipes7f757632011-12-02 15:53:32 -050024
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060025
Attila Fazekas19044d52013-02-16 07:35:06 +010026class ImagesTestJSON(base.BaseComputeTest):
27 _interface = 'json'
28
29 @classmethod
30 def setUpClass(cls):
31 super(ImagesTestJSON, cls).setUpClass()
Matthew Treinish853ae442013-07-19 16:36:07 -040032 if not cls.config.service_available.glance:
33 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
34 raise cls.skipException(skip_msg)
Attila Fazekas19044d52013-02-16 07:35:06 +010035 cls.client = cls.images_client
36 cls.servers_client = cls.servers_client
37
38 cls.image_ids = []
39
40 if compute.MULTI_USER:
41 if cls.config.compute.allow_tenant_isolation:
Matthew Treinishb86cda92013-07-29 11:22:23 -040042 creds = cls.isolated_creds.get_alt_creds()
Attila Fazekas19044d52013-02-16 07:35:06 +010043 username, tenant_name, password = creds
44 cls.alt_manager = clients.Manager(username=username,
45 password=password,
46 tenant_name=tenant_name)
47 else:
48 # Use the alt_XXX credentials in the config file
49 cls.alt_manager = clients.AltManager()
50 cls.alt_client = cls.alt_manager.images_client
Rohit Karajgiea462ae2012-05-27 21:23:21 -070051
52 def tearDown(self):
Sean Daguef237ccb2013-01-04 15:19:14 -050053 """Terminate test instances created after a test is executed."""
Rohit Karajgiea462ae2012-05-27 21:23:21 -070054 for image_id in self.image_ids:
55 self.client.delete_image(image_id)
56 self.image_ids.remove(image_id)
Attila Fazekas19044d52013-02-16 07:35:06 +010057 super(ImagesTestJSON, self).tearDown()
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060058
saradpatel5ba4ff22013-03-11 22:08:17 -070059 def __create_image__(self, server_id, name, meta=None):
60 resp, body = self.client.create_image(server_id, name, meta)
61 image_id = parse_image_id(resp['location'])
62 self.client.wait_for_image_resp_code(image_id, 200)
63 self.client.wait_for_image_status(image_id, 'ACTIVE')
64 self.image_ids.append(image_id)
65 return resp, body
66
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040067 @attr(type=['negative', 'gate'])
Ravikumar Venkatesan94d81172012-01-09 21:53:14 -080068 def test_create_image_from_deleted_server(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050069 # An image should not be created if the server instance is removed
Sean Dague22897e12013-02-25 17:54:09 -050070 resp, server = self.create_server(wait_until='ACTIVE')
Ravikumar Venkatesan94d81172012-01-09 21:53:14 -080071
72 # Delete server before trying to create server
73 self.servers_client.delete_server(server['id'])
saradpatel5ba4ff22013-03-11 22:08:17 -070074 self.servers_client.wait_for_server_termination(server['id'])
75 # Create a new image after server is deleted
76 name = rand_name('image')
77 meta = {'image_type': 'test'}
78 self.assertRaises(exceptions.NotFound,
79 self.__create_image__,
80 server['id'], name, meta)
rajalakshmi-ganesan32f8db62012-05-18 19:13:40 +053081
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040082 @attr(type=['negative', 'gate'])
rajalakshmi-ganesan32f8db62012-05-18 19:13:40 +053083 def test_create_image_from_invalid_server(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050084 # An image should not be created with invalid server id
saradpatel5ba4ff22013-03-11 22:08:17 -070085 # Create a new image with invalid server id
86 name = rand_name('image')
87 meta = {'image_type': 'test'}
88 resp = {}
89 resp['status'] = None
90 self.assertRaises(exceptions.NotFound, self.__create_image__,
91 '!@#$%^&*()', name, meta)
rajalakshmi-ganesan32f8db62012-05-18 19:13:40 +053092
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040093 @attr(type=['negative', 'gate'])
Liu, Zhi Kun3fb36952013-07-18 00:05:05 +080094 def test_create_image_from_stopped_server(self):
95 resp, server = self.create_server(wait_until='ACTIVE')
96 self.servers_client.stop(server['id'])
97 self.servers_client.wait_for_server_status(server['id'],
98 'SHUTOFF')
99 self.addCleanup(self.servers_client.delete_server, server['id'])
100 snapshot_name = rand_name('test-snap-')
101 resp, image = self.create_image_from_server(server['id'],
102 name=snapshot_name,
103 wait_until='ACTIVE')
104 self.addCleanup(self.client.delete_image, image['id'])
105 self.assertEqual(snapshot_name, image['name'])
106
107 @attr(type='gate')
108 def test_delete_saving_image(self):
109 snapshot_name = rand_name('test-snap-')
110 resp, server = self.create_server(wait_until='ACTIVE')
111 self.addCleanup(self.servers_client.delete_server, server['id'])
112 resp, image = self.create_image_from_server(server['id'],
113 name=snapshot_name,
114 wait_until='SAVING')
115 resp, body = self.client.delete_image(image['id'])
116 self.assertEqual('204', resp['status'])
117
118 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700119 def test_create_image_specify_uuid_35_characters_or_less(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500120 # Return an error if Image ID passed is 35 characters or less
Chris Yeohe04628e2013-02-25 17:12:21 +1030121 snapshot_name = rand_name('test-snap-')
122 test_uuid = ('a' * 35)
123 self.assertRaises(exceptions.NotFound, self.client.create_image,
124 test_uuid, snapshot_name)
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700125
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400126 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700127 def test_create_image_specify_uuid_37_characters_or_more(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500128 # Return an error if Image ID passed is 37 characters or more
Chris Yeohe04628e2013-02-25 17:12:21 +1030129 snapshot_name = rand_name('test-snap-')
130 test_uuid = ('a' * 37)
131 self.assertRaises(exceptions.NotFound, self.client.create_image,
132 test_uuid, snapshot_name)
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700133
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400134 @attr(type=['negative', 'gate'])
rajalakshmi-ganesan32f8db62012-05-18 19:13:40 +0530135 def test_delete_image_with_invalid_image_id(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500136 # An image should not be deleted with invalid image id
Chris Yeohe04628e2013-02-25 17:12:21 +1030137 self.assertRaises(exceptions.NotFound, self.client.delete_image,
138 '!@$%^&*()')
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700139
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400140 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700141 def test_delete_non_existent_image(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500142 # Return an error while trying to delete a non-existent image
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700143
144 non_existent_image_id = '11a22b9-12a9-5555-cc11-00ab112223fa'
145 self.assertRaises(exceptions.NotFound, self.client.delete_image,
146 non_existent_image_id)
147
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400148 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700149 def test_delete_image_blank_id(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500150 # Return an error while trying to delete an image with blank Id
Chris Yeohe04628e2013-02-25 17:12:21 +1030151 self.assertRaises(exceptions.NotFound, self.client.delete_image, '')
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700152
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400153 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700154 def test_delete_image_non_hex_string_id(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500155 # Return an error while trying to delete an image with non hex id
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700156 image_id = '11a22b9-120q-5555-cc11-00ab112223gj'
Chris Yeohe04628e2013-02-25 17:12:21 +1030157 self.assertRaises(exceptions.NotFound, self.client.delete_image,
158 image_id)
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700159
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400160 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700161 def test_delete_image_negative_image_id(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500162 # Return an error while trying to delete an image with negative id
Chris Yeohe04628e2013-02-25 17:12:21 +1030163 self.assertRaises(exceptions.NotFound, self.client.delete_image, -1)
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700164
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400165 @attr(type=['negative', 'gate'])
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700166 def test_delete_image_id_is_over_35_character_limit(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500167 # Return an error while trying to delete image with id over limit
Chris Yeohe04628e2013-02-25 17:12:21 +1030168 self.assertRaises(exceptions.NotFound, self.client.delete_image,
Ken'ichi Ohmichi64a42e02013-09-17 10:01:22 +0900169 '11a22b9-12a9-5555-cc11-00ab112223fa-3fac')
Rohit Karajgiea462ae2012-05-27 21:23:21 -0700170
Dan Smithe7316bb2012-08-14 12:35:34 -0700171
Attila Fazekas19044d52013-02-16 07:35:06 +0100172class ImagesTestXML(ImagesTestJSON):
173 _interface = 'xml'