1# Licensed under the Apache License, Version 2.0 (the "License"); you may 2# not use this file except in compliance with the License. You may obtain 3# a copy of the License at 4# 5# http://www.apache.org/licenses/LICENSE-2.0 6# 7# Unless required by applicable law or agreed to in writing, software 8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10# License for the specific language governing permissions and limitations 11# under the License. 12 13""" 14test_compute 15---------------------------------- 16 17Functional tests for `shade` image methods. 18""" 19 20import filecmp 21import os 22import tempfile 23 24from openstack.tests.functional import base 25 26 27class TestImage(base.BaseFunctionalTest): 28 def setUp(self): 29 super(TestImage, self).setUp() 30 self.image = self.pick_image() 31 32 def test_create_image(self): 33 test_image = tempfile.NamedTemporaryFile(delete=False) 34 test_image.write(b'\0' * 1024 * 1024) 35 test_image.close() 36 image_name = self.getUniqueString('image') 37 try: 38 self.user_cloud.create_image( 39 name=image_name, 40 filename=test_image.name, 41 disk_format='raw', 42 container_format='bare', 43 min_disk=10, 44 min_ram=1024, 45 tags=['custom'], 46 wait=True) 47 finally: 48 self.user_cloud.delete_image(image_name, wait=True) 49 50 def test_download_image(self): 51 test_image = tempfile.NamedTemporaryFile(delete=False) 52 self.addCleanup(os.remove, test_image.name) 53 test_image.write(b'\0' * 1024 * 1024) 54 test_image.close() 55 image_name = self.getUniqueString('image') 56 self.user_cloud.create_image( 57 name=image_name, 58 filename=test_image.name, 59 disk_format='raw', 60 container_format='bare', 61 min_disk=10, 62 min_ram=1024, 63 wait=True) 64 self.addCleanup(self.user_cloud.delete_image, image_name, wait=True) 65 output = os.path.join(tempfile.gettempdir(), self.getUniqueString()) 66 self.user_cloud.download_image(image_name, output) 67 self.addCleanup(os.remove, output) 68 self.assertTrue(filecmp.cmp(test_image.name, output), 69 "Downloaded contents don't match created image") 70 71 def test_create_image_skip_duplicate(self): 72 test_image = tempfile.NamedTemporaryFile(delete=False) 73 test_image.write(b'\0' * 1024 * 1024) 74 test_image.close() 75 image_name = self.getUniqueString('image') 76 try: 77 first_image = self.user_cloud.create_image( 78 name=image_name, 79 filename=test_image.name, 80 disk_format='raw', 81 container_format='bare', 82 min_disk=10, 83 min_ram=1024, 84 validate_checksum=True, 85 wait=True) 86 second_image = self.user_cloud.create_image( 87 name=image_name, 88 filename=test_image.name, 89 disk_format='raw', 90 container_format='bare', 91 min_disk=10, 92 min_ram=1024, 93 validate_checksum=True, 94 wait=True) 95 self.assertEqual(first_image.id, second_image.id) 96 finally: 97 self.user_cloud.delete_image(image_name, wait=True) 98 99 def test_create_image_force_duplicate(self): 100 test_image = tempfile.NamedTemporaryFile(delete=False) 101 test_image.write(b'\0' * 1024 * 1024) 102 test_image.close() 103 image_name = self.getUniqueString('image') 104 first_image = None 105 second_image = None 106 try: 107 first_image = self.user_cloud.create_image( 108 name=image_name, 109 filename=test_image.name, 110 disk_format='raw', 111 container_format='bare', 112 min_disk=10, 113 min_ram=1024, 114 wait=True) 115 second_image = self.user_cloud.create_image( 116 name=image_name, 117 filename=test_image.name, 118 disk_format='raw', 119 container_format='bare', 120 min_disk=10, 121 min_ram=1024, 122 allow_duplicates=True, 123 wait=True) 124 self.assertNotEqual(first_image.id, second_image.id) 125 finally: 126 if first_image: 127 self.user_cloud.delete_image(first_image.id, wait=True) 128 if second_image: 129 self.user_cloud.delete_image(second_image.id, wait=True) 130 131 def test_create_image_update_properties(self): 132 test_image = tempfile.NamedTemporaryFile(delete=False) 133 test_image.write(b'\0' * 1024 * 1024) 134 test_image.close() 135 image_name = self.getUniqueString('image') 136 try: 137 image = self.user_cloud.create_image( 138 name=image_name, 139 filename=test_image.name, 140 disk_format='raw', 141 container_format='bare', 142 min_disk=10, 143 min_ram=1024, 144 wait=True) 145 self.user_cloud.update_image_properties( 146 image=image, 147 name=image_name, 148 foo='bar') 149 image = self.user_cloud.get_image(image_name) 150 self.assertIn('foo', image.properties) 151 self.assertEqual(image.properties['foo'], 'bar') 152 finally: 153 self.user_cloud.delete_image(image_name, wait=True) 154 155 def test_create_image_without_filename(self): 156 image_name = self.getUniqueString('image') 157 image = self.user_cloud.create_image( 158 name=image_name, 159 disk_format='raw', 160 container_format='bare', 161 min_disk=10, 162 min_ram=1024, 163 allow_duplicates=True, 164 wait=False) 165 self.assertEqual(image_name, image.name) 166 self.user_cloud.delete_image(image.id, wait=True) 167 168 def test_get_image_by_id(self): 169 test_image = tempfile.NamedTemporaryFile(delete=False) 170 test_image.write(b'\0' * 1024 * 1024) 171 test_image.close() 172 image_name = self.getUniqueString('image') 173 try: 174 image = self.user_cloud.create_image( 175 name=image_name, 176 filename=test_image.name, 177 disk_format='raw', 178 container_format='bare', 179 min_disk=10, 180 min_ram=1024, 181 wait=True) 182 image = self.user_cloud.get_image_by_id(image.id) 183 self.assertEqual(image_name, image.name) 184 self.assertEqual('raw', image.disk_format) 185 finally: 186 self.user_cloud.delete_image(image_name, wait=True) 187