1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 # and others. All rights reserved.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 from glanceclient.exc import HTTPBadRequest
18 from urllib.request import URLError
20 from urllib2 import URLError
29 from snaps import file_utils
30 from snaps.openstack import create_image
31 from snaps.openstack.create_image import (ImageSettings, ImageCreationError,
33 from snaps.openstack.tests import openstack_tests
34 from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
35 from snaps.openstack.utils import glance_utils
37 __author__ = 'spisarski'
39 logger = logging.getLogger('create_image_tests')
42 class ImageSettingsUnitTests(unittest.TestCase):
44 Tests the construction of the ImageSettings class
47 def test_no_params(self):
48 with self.assertRaises(ImageSettingsError):
51 def test_empty_config(self):
52 with self.assertRaises(ImageSettingsError):
53 ImageSettings(**dict())
55 def test_name_only(self):
56 with self.assertRaises(ImageSettingsError):
57 ImageSettings(name='foo')
59 def test_config_with_name_only(self):
60 with self.assertRaises(ImageSettingsError):
61 ImageSettings(**{'name': 'foo'})
63 def test_name_user_only(self):
64 with self.assertRaises(ImageSettingsError):
65 ImageSettings(name='foo', image_user='bar')
67 def test_config_with_name_user_only(self):
68 with self.assertRaises(ImageSettingsError):
69 ImageSettings(**{'name': 'foo', 'image_user': 'bar'})
71 def test_name_user_format_only(self):
72 with self.assertRaises(ImageSettingsError):
73 ImageSettings(name='foo', image_user='bar', img_format='qcow2')
75 def test_config_with_name_user_format_only(self):
76 with self.assertRaises(ImageSettingsError):
78 **{'name': 'foo', 'image_user': 'bar', 'format': 'qcow2'})
80 def test_name_user_format_url_file_only(self):
81 with self.assertRaises(ImageSettingsError):
82 ImageSettings(name='foo', image_user='bar', img_format='qcow2',
84 image_file='/foo/bar.qcow')
86 def test_config_with_name_user_format_url_file_only(self):
87 with self.assertRaises(ImageSettingsError):
89 **{'name': 'foo', 'image_user': 'bar', 'format': 'qcow2',
90 'download_url': 'http://foo.com',
91 'image_file': '/foo/bar.qcow'})
93 def test_name_user_format_url_only(self):
94 settings = ImageSettings(name='foo', image_user='bar',
95 img_format='qcow2', url='http://foo.com')
96 self.assertEqual('foo', settings.name)
97 self.assertEqual('bar', settings.image_user)
98 self.assertEqual('qcow2', settings.format)
99 self.assertEqual('http://foo.com', settings.url)
100 self.assertIsNone(settings.image_file)
101 self.assertFalse(settings.exists)
102 self.assertFalse(settings.public)
103 self.assertIsNone(settings.nic_config_pb_loc)
105 def test_name_user_format_url_only_properties(self):
106 properties = {'hw_video_model': 'vga'}
107 settings = ImageSettings(name='foo', image_user='bar',
108 img_format='qcow2', url='http://foo.com',
109 extra_properties=properties)
110 self.assertEqual('foo', settings.name)
111 self.assertEqual('bar', settings.image_user)
112 self.assertEqual('qcow2', settings.format)
113 self.assertEqual('http://foo.com', settings.url)
114 self.assertEqual(properties, settings.extra_properties)
115 self.assertIsNone(settings.image_file)
116 self.assertFalse(settings.exists)
117 self.assertFalse(settings.public)
118 self.assertIsNone(settings.nic_config_pb_loc)
120 def test_config_with_name_user_format_url_only(self):
121 settings = ImageSettings(
122 **{'name': 'foo', 'image_user': 'bar', 'format': 'qcow2',
123 'download_url': 'http://foo.com'})
124 self.assertEqual('foo', settings.name)
125 self.assertEqual('bar', settings.image_user)
126 self.assertEqual('qcow2', settings.format)
127 self.assertEqual('http://foo.com', settings.url)
128 self.assertIsNone(settings.image_file)
129 self.assertFalse(settings.exists)
130 self.assertFalse(settings.public)
131 self.assertIsNone(settings.nic_config_pb_loc)
133 def test_name_user_format_file_only(self):
134 settings = ImageSettings(name='foo', image_user='bar',
136 image_file='/foo/bar.qcow')
137 self.assertEqual('foo', settings.name)
138 self.assertEqual('bar', settings.image_user)
139 self.assertEqual('qcow2', settings.format)
140 self.assertIsNone(settings.url)
141 self.assertEqual('/foo/bar.qcow', settings.image_file)
142 self.assertFalse(settings.exists)
143 self.assertFalse(settings.public)
144 self.assertIsNone(settings.nic_config_pb_loc)
146 def test_config_with_name_user_format_file_only(self):
147 settings = ImageSettings(
148 **{'name': 'foo', 'image_user': 'bar', 'format': 'qcow2',
149 'image_file': '/foo/bar.qcow'})
150 self.assertEqual('foo', settings.name)
151 self.assertEqual('bar', settings.image_user)
152 self.assertEqual('qcow2', settings.format)
153 self.assertIsNone(settings.url)
154 self.assertEqual('/foo/bar.qcow', settings.image_file)
155 self.assertFalse(settings.exists)
156 self.assertFalse(settings.public)
157 self.assertIsNone(settings.nic_config_pb_loc)
159 def test_all_url(self):
160 properties = {'hw_video_model': 'vga'}
161 kernel_settings = ImageSettings(name='kernel', url='http://kernel.com',
162 image_user='bar', img_format='qcow2')
163 ramdisk_settings = ImageSettings(name='ramdisk',
164 url='http://ramdisk.com',
165 image_user='bar', img_format='qcow2')
166 settings = ImageSettings(name='foo', image_user='bar',
167 img_format='qcow2', url='http://foo.com',
168 extra_properties=properties,
169 nic_config_pb_loc='/foo/bar',
170 kernel_image_settings=kernel_settings,
171 ramdisk_image_settings=ramdisk_settings,
172 exists=True, public=True)
173 self.assertEqual('foo', settings.name)
174 self.assertEqual('bar', settings.image_user)
175 self.assertEqual('qcow2', settings.format)
176 self.assertEqual('http://foo.com', settings.url)
177 self.assertEqual(properties, settings.extra_properties)
178 self.assertIsNone(settings.image_file)
179 self.assertEqual('/foo/bar', settings.nic_config_pb_loc)
180 self.assertEqual('kernel', settings.kernel_image_settings.name)
181 self.assertEqual('http://kernel.com',
182 settings.kernel_image_settings.url)
183 self.assertEqual('bar', settings.kernel_image_settings.image_user)
184 self.assertEqual('qcow2', settings.kernel_image_settings.format)
185 self.assertEqual('ramdisk', settings.ramdisk_image_settings.name)
186 self.assertEqual('http://ramdisk.com',
187 settings.ramdisk_image_settings.url)
188 self.assertEqual('bar', settings.ramdisk_image_settings.image_user)
189 self.assertEqual('qcow2', settings.ramdisk_image_settings.format)
190 self.assertTrue(settings.exists)
191 self.assertTrue(settings.public)
193 def test_config_all_url(self):
194 settings = ImageSettings(
195 **{'name': 'foo', 'image_user': 'bar', 'format': 'qcow2',
196 'download_url': 'http://foo.com',
197 'extra_properties': '{\'hw_video_model\': \'vga\'}',
198 'nic_config_pb_loc': '/foo/bar',
199 'kernel_image_settings': {
201 'download_url': 'http://kernel.com',
204 'ramdisk_image_settings': {
206 'download_url': 'http://ramdisk.com',
209 'exists': True, 'public': True})
210 self.assertEqual('foo', settings.name)
211 self.assertEqual('bar', settings.image_user)
212 self.assertEqual('qcow2', settings.format)
213 self.assertEqual('http://foo.com', settings.url)
214 self.assertEqual('{\'hw_video_model\': \'vga\'}',
215 settings.extra_properties)
216 self.assertIsNone(settings.image_file)
217 self.assertEqual('/foo/bar', settings.nic_config_pb_loc)
218 self.assertEqual('kernel', settings.kernel_image_settings.name)
219 self.assertEqual('http://kernel.com',
220 settings.kernel_image_settings.url)
221 self.assertEqual('ramdisk', settings.ramdisk_image_settings.name)
222 self.assertEqual('http://ramdisk.com',
223 settings.ramdisk_image_settings.url)
224 self.assertTrue(settings.exists)
225 self.assertTrue(settings.public)
227 def test_all_file(self):
228 properties = {'hw_video_model': 'vga'}
229 settings = ImageSettings(name='foo', image_user='bar',
231 image_file='/foo/bar.qcow',
232 extra_properties=properties,
233 nic_config_pb_loc='/foo/bar', exists=True,
235 self.assertEqual('foo', settings.name)
236 self.assertEqual('bar', settings.image_user)
237 self.assertEqual('qcow2', settings.format)
238 self.assertIsNone(settings.url)
239 self.assertEqual('/foo/bar.qcow', settings.image_file)
240 self.assertEqual(properties, settings.extra_properties)
241 self.assertEqual('/foo/bar', settings.nic_config_pb_loc)
242 self.assertTrue(settings.exists)
243 self.assertTrue(settings.public)
245 def test_config_all_file(self):
246 settings = ImageSettings(
247 **{'name': 'foo', 'image_user': 'bar', 'format': 'qcow2',
248 'image_file': '/foo/bar.qcow',
249 'extra_properties': '{\'hw_video_model\' : \'vga\'}',
250 'nic_config_pb_loc': '/foo/bar', 'exists': True,
252 self.assertEqual('foo', settings.name)
253 self.assertEqual('bar', settings.image_user)
254 self.assertEqual('qcow2', settings.format)
255 self.assertIsNone(settings.url)
256 self.assertEqual('/foo/bar.qcow', settings.image_file)
257 self.assertEqual('{\'hw_video_model\' : \'vga\'}',
258 settings.extra_properties)
259 self.assertEqual('/foo/bar', settings.nic_config_pb_loc)
260 self.assertTrue(settings.exists)
261 self.assertTrue(settings.public)
264 class CreateImageSuccessTests(OSIntegrationTestCase):
266 Test for the CreateImage class defined in create_image.py
271 Instantiates the CreateImage object that is responsible for downloading
272 and creating an OS image file within OpenStack
274 super(self.__class__, self).__start__()
277 self.image_name = self.__class__.__name__ + '-' + str(guid)
278 self.glance = glance_utils.glance_client(self.os_creds)
279 self.image_creator = None
281 if self.image_metadata and 'glance_tests' in self.image_metadata:
282 glance_test_meta = self.image_metadata['glance_tests']
284 glance_test_meta = None
286 self.tmp_dir = 'tmp/' + str(guid)
287 if not os.path.exists(self.tmp_dir):
288 os.makedirs(self.tmp_dir)
290 self.image_settings = openstack_tests.cirros_image_settings(
291 name=self.image_name,
292 image_metadata=glance_test_meta)
296 Cleans the image and downloaded image file
298 if self.image_creator:
299 self.image_creator.clean()
301 if os.path.exists(self.tmp_dir) and os.path.isdir(self.tmp_dir):
302 shutil.rmtree(self.tmp_dir)
304 super(self.__class__, self).__clean__()
306 def test_create_image_clean_url(self):
308 Tests the creation of an OpenStack image from a URL.
311 # Set the default image settings, then set any custom parameters sent
314 self.image_creator = create_image.OpenStackImage(self.os_creds,
316 created_image = self.image_creator.create()
317 self.assertIsNotNone(created_image)
319 retrieved_image = glance_utils.get_image(self.glance,
320 self.image_settings.name)
321 self.assertIsNotNone(retrieved_image)
322 self.assertEqual(created_image.size, retrieved_image.size)
323 self.assertEqual(get_image_size(self.image_settings),
324 retrieved_image.size)
325 self.assertEqual(created_image.name, retrieved_image.name)
326 self.assertEqual(created_image.id, retrieved_image.id)
328 def test_create_image_clean_url_properties(self):
330 Tests the creation of an OpenStack image from a URL and set properties.
333 # Set the default image settings, then set any custom parameters sent
335 self.image_creator = create_image.OpenStackImage(self.os_creds,
337 created_image = self.image_creator.create()
338 self.assertIsNotNone(created_image)
340 retrieved_image = glance_utils.get_image(self.glance,
341 self.image_settings.name)
342 self.assertIsNotNone(retrieved_image)
343 self.assertEqual(self.image_creator.get_image().size,
344 retrieved_image.size)
345 self.assertEqual(get_image_size(self.image_settings),
346 retrieved_image.size)
347 self.assertEqual(created_image.name, retrieved_image.name)
348 self.assertEqual(created_image.id, retrieved_image.id)
349 self.assertEqual(created_image.properties, retrieved_image.properties)
351 def test_create_image_clean_file(self):
353 Tests the creation of an OpenStack image from a file.
355 if not self.image_settings.image_file and self.image_settings.url:
356 # Download the file of the image
357 image_file_name = file_utils.download(self.image_settings.url,
360 image_file_name = self.image_settings.image_file
363 file_image_settings = openstack_tests.file_image_test_settings(
364 name=self.image_name, file_path=image_file_name)
366 self.image_creator = create_image.OpenStackImage(
367 self.os_creds, file_image_settings)
368 created_image = self.image_creator.create()
369 self.assertIsNotNone(created_image)
370 self.assertEqual(self.image_name, created_image.name)
372 retrieved_image = glance_utils.get_image(
373 self.glance, file_image_settings.name)
374 self.assertIsNotNone(retrieved_image)
375 self.assertEqual(self.image_creator.get_image().size,
376 retrieved_image.size)
377 self.assertEqual(get_image_size(file_image_settings),
378 retrieved_image.size)
380 self.assertEqual(created_image.name, retrieved_image.name)
381 self.assertEqual(created_image.id, retrieved_image.id)
384 'Test not executed as the image metadata requires image files')
386 def test_create_delete_image(self):
388 Tests the creation then deletion of an OpenStack image to ensure
389 clean() does not raise an Exception.
392 self.image_creator = create_image.OpenStackImage(self.os_creds,
394 created_image = self.image_creator.create()
395 self.assertIsNotNone(created_image)
397 retrieved_image = glance_utils.get_image(self.glance,
398 self.image_settings.name)
399 self.assertIsNotNone(retrieved_image)
400 self.assertEqual(self.image_creator.get_image().size,
401 retrieved_image.size)
402 self.assertEqual(get_image_size(self.image_settings),
403 retrieved_image.size)
405 # Delete Image manually
406 glance_utils.delete_image(self.glance, created_image)
408 self.assertIsNone(glance_utils.get_image(
409 self.glance, self.image_creator.image_settings.name))
411 # Must not throw an exception when attempting to cleanup non-existent
413 self.image_creator.clean()
414 self.assertIsNone(self.image_creator.get_image())
416 def test_create_same_image(self):
418 Tests the creation of an OpenStack image when the image already exists.
421 self.image_creator = create_image.OpenStackImage(self.os_creds,
423 image1 = self.image_creator.create()
425 retrieved_image = glance_utils.get_image(self.glance,
426 self.image_settings.name)
427 self.assertIsNotNone(retrieved_image)
428 self.assertEqual(self.image_creator.get_image().size,
429 retrieved_image.size)
430 self.assertEqual(get_image_size(self.image_settings),
431 retrieved_image.size)
432 self.assertEqual(image1.name, retrieved_image.name)
433 self.assertEqual(image1.id, retrieved_image.id)
434 self.assertEqual(image1.properties, retrieved_image.properties)
436 # Should be retrieving the instance data
437 os_image_2 = create_image.OpenStackImage(self.os_creds,
439 image2 = os_image_2.create()
440 self.assertEqual(image1.id, image2.id)
442 def test_create_same_image_new_settings(self):
444 Tests the creation of an OpenStack image when the image already exists
445 and the configuration only contains the name.
448 self.image_creator = create_image.OpenStackImage(self.os_creds,
450 image1 = self.image_creator.create()
452 retrieved_image = glance_utils.get_image(self.glance,
453 self.image_settings.name)
454 self.assertIsNotNone(retrieved_image)
455 self.assertEqual(self.image_creator.get_image().size,
456 retrieved_image.size)
457 self.assertEqual(get_image_size(self.image_settings),
458 retrieved_image.size)
459 self.assertEqual(image1.name, retrieved_image.name)
460 self.assertEqual(image1.id, retrieved_image.id)
461 self.assertEqual(image1.properties, retrieved_image.properties)
463 # Should be retrieving the instance data
464 image_2_settings = ImageSettings(name=self.image_settings.name,
465 image_user='foo', exists=True)
466 os_image_2 = create_image.OpenStackImage(self.os_creds,
468 image2 = os_image_2.create()
469 self.assertEqual(image1.id, image2.id)
472 class CreateImageNegativeTests(OSIntegrationTestCase):
474 Negative test cases for the CreateImage class
478 super(self.__class__, self).__start__()
480 self.image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
481 self.image_creator = None
484 if self.image_creator:
485 self.image_creator.clean()
487 super(self.__class__, self).__clean__()
489 def test_bad_image_name(self):
491 Expect an ImageCreationError when the image name does not exist when a
492 file or URL has not been configured
494 os_image_settings = ImageSettings(name='foo', image_user='bar',
496 self.image_creator = create_image.OpenStackImage(self.os_creds,
499 with self.assertRaises(ImageCreationError):
500 self.image_creator.create()
502 self.fail('ImageCreationError should have been raised prior to'
505 def test_bad_image_url(self):
507 Expect an ImageCreationError when the image download url is bad
509 os_image_settings = openstack_tests.cirros_image_settings(
510 name=self.image_name)
511 self.image_creator = create_image.OpenStackImage(
513 create_image.ImageSettings(name=os_image_settings.name,
514 image_user=os_image_settings.image_user,
515 img_format=os_image_settings.format,
516 url="http://foo.bar"))
519 self.image_creator.create()
520 except HTTPBadRequest:
524 except Exception as e:
525 self.fail('Invalid Exception ' + str(e))
527 def test_bad_image_image_type(self):
529 Expect an ImageCreationError when the image type bad
531 os_image_settings = openstack_tests.cirros_image_settings(
532 name=self.image_name)
533 self.image_creator = create_image.OpenStackImage(
535 create_image.ImageSettings(name=os_image_settings.name,
536 image_user=os_image_settings.image_user,
538 url=os_image_settings.url))
540 with self.assertRaises(Exception):
541 self.image_creator.create()
543 def test_bad_image_file(self):
545 Expect an ImageCreationError when the image file does not exist
547 os_image_settings = openstack_tests.cirros_image_settings(
548 name=self.image_name)
549 self.image_creator = create_image.OpenStackImage(
551 create_image.ImageSettings(name=os_image_settings.name,
552 image_user=os_image_settings.image_user,
553 img_format=os_image_settings.format,
554 image_file="/foo/bar.qcow"))
555 with self.assertRaises(IOError):
556 self.image_creator.create()
559 class CreateMultiPartImageTests(OSIntegrationTestCase):
561 Test different means for creating a 3-part images
566 Instantiates the CreateImage object that is responsible for
567 downloading and creating an OS image file within OpenStack
569 super(self.__class__, self).__start__()
572 self.image_creators = list()
573 self.image_name = self.__class__.__name__ + '-' + str(guid)
574 self.glance = glance_utils.glance_client(self.os_creds)
576 self.tmp_dir = 'tmp/' + str(guid)
577 if not os.path.exists(self.tmp_dir):
578 os.makedirs(self.tmp_dir)
580 if self.image_metadata and 'glance_tests' in self.image_metadata:
581 self.glance_test_meta = self.image_metadata['glance_tests']
583 self.glance_test_meta = dict()
587 Cleans the images and downloaded image file
589 for image_creator in self.image_creators:
590 image_creator.clean()
592 if os.path.exists(self.tmp_dir) and os.path.isdir(self.tmp_dir):
593 shutil.rmtree(self.tmp_dir)
595 super(self.__class__, self).__clean__()
597 def test_create_three_part_image_from_url(self):
599 Tests the creation of a 3-part OpenStack image from a URL.
601 # Create the kernel image
602 if 'disk_file' not in self.glance_test_meta:
603 image_settings = openstack_tests.cirros_image_settings(
604 name=self.image_name,
607 openstack_tests.CIRROS_DEFAULT_IMAGE_URL,
609 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL,
611 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL})
613 image_creator = create_image.OpenStackImage(self.os_creds,
615 self.image_creators.append(image_creator)
616 image_creator.create()
618 main_image = glance_utils.get_image(self.glance,
620 self.assertIsNotNone(main_image)
621 self.assertIsNotNone(image_creator.get_image())
622 self.assertEqual(image_creator.get_image().id, main_image.id)
624 kernel_image = glance_utils.get_image(
625 self.glance, image_settings.kernel_image_settings.name)
626 self.assertIsNotNone(kernel_image)
627 self.assertIsNotNone(image_creator.get_kernel_image())
628 self.assertEqual(kernel_image.id,
629 image_creator.get_kernel_image().id)
631 ramdisk_image = glance_utils.get_image(
632 self.glance, image_settings.ramdisk_image_settings.name)
633 self.assertIsNotNone(ramdisk_image)
634 self.assertIsNotNone(image_creator.get_ramdisk_image())
635 self.assertEqual(ramdisk_image.id,
636 image_creator.get_ramdisk_image().id)
639 'Test not executed as the image metadata requires image files')
641 def test_create_three_part_image_from_file_3_creators(self):
643 Tests the creation of a 3-part OpenStack image from files.
649 if self.glance_test_meta:
650 if 'extra_properties' in self.glance_test_meta:
651 properties = self.glance_test_meta['extra_properties']
652 if 'disk_file' in self.glance_test_meta:
655 # Create the kernel image
656 kernel_file_name = None
657 kernel_url = openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL
658 if 'kernel_file' in self.glance_test_meta:
659 kernel_file_name = self.glance_test_meta['kernel_file']
660 elif 'kernel_url' in self.glance_test_meta:
661 kernel_url = self.glance_test_meta['kernel_url']
663 kernel_url = openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL
665 if not kernel_file_name and not file_only:
666 kernel_file_name = file_utils.download(kernel_url,
669 logger.warn('Will not download the kernel image.'
670 ' Cannot execute test')
673 kernel_file_image_settings = openstack_tests.file_image_test_settings(
674 name=self.image_name + '_kernel', file_path=kernel_file_name)
676 self.image_creators.append(create_image.OpenStackImage(
677 self.os_creds, kernel_file_image_settings))
678 kernel_image = self.image_creators[-1].create()
679 self.assertIsNotNone(kernel_image)
680 self.assertEqual(get_image_size(kernel_file_image_settings),
683 # Create the ramdisk image
684 ramdisk_file_name = None
685 ramdisk_url = openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL
686 if 'ramdisk_file' in self.glance_test_meta:
687 ramdisk_file_name = self.glance_test_meta['ramdisk_file']
688 elif 'ramdisk_url' in self.glance_test_meta:
689 ramdisk_url = self.glance_test_meta['ramdisk_url']
691 if not ramdisk_file_name and not file_only:
692 ramdisk_file_name = file_utils.download(ramdisk_url,
695 logger.warn('Will not download the ramdisk image.'
696 ' Cannot execute test')
699 ramdisk_file_image_settings = openstack_tests.file_image_test_settings(
700 name=self.image_name + '_ramdisk', file_path=ramdisk_file_name)
701 self.image_creators.append(create_image.OpenStackImage(
702 self.os_creds, ramdisk_file_image_settings))
703 ramdisk_image = self.image_creators[-1].create()
704 self.assertIsNotNone(ramdisk_image)
705 self.assertEqual(get_image_size(ramdisk_file_image_settings),
708 # Create the main disk image
709 disk_file_name = None
710 disk_url = openstack_tests.CIRROS_DEFAULT_IMAGE_URL
711 if 'disk_file' in self.glance_test_meta:
712 disk_file_name = self.glance_test_meta['disk_file']
713 elif 'disk_url' in self.glance_test_meta:
714 disk_url = self.glance_test_meta['disk_url']
716 if not disk_file_name and not file_only:
717 disk_file_name = file_utils.download(disk_url, self.tmp_dir).name
719 logger.warn('Will not download the disk file image.'
720 ' Cannot execute test')
723 file_image_settings = openstack_tests.file_image_test_settings(
724 name=self.image_name, file_path=disk_file_name)
725 properties['kernel_id'] = kernel_image.id
726 properties['ramdisk_id'] = ramdisk_image.id
727 file_image_settings.extra_properties = properties
728 self.image_creators.append(
729 create_image.OpenStackImage(self.os_creds, file_image_settings))
730 created_image = self.image_creators[-1].create()
732 self.assertIsNotNone(created_image)
733 self.assertEqual(self.image_name, created_image.name)
735 retrieved_image = glance_utils.get_image(self.glance,
736 file_image_settings.name)
737 self.assertIsNotNone(retrieved_image)
738 self.assertEqual(self.image_creators[-1].get_image().size,
739 retrieved_image.size)
740 self.assertEqual(get_image_size(file_image_settings),
741 retrieved_image.size)
742 self.assertEqual(created_image.name, retrieved_image.name)
743 self.assertEqual(created_image.id, retrieved_image.id)
744 self.assertEqual(created_image.properties, retrieved_image.properties)
746 def test_create_three_part_image_from_url_3_creators(self):
748 Tests the creation of a 3-part OpenStack image from a URL.
750 if 'disk_file' not in self.glance_test_meta:
753 if self.glance_test_meta and \
754 'extra_properties' in self.glance_test_meta:
755 properties = self.glance_test_meta['extra_properties']
757 # Create the kernel image
758 kernel_image_settings = openstack_tests.cirros_image_settings(
759 name=self.image_name + '_kernel',
760 url=openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL)
762 if self.glance_test_meta:
763 if 'kernel_url' in self.glance_test_meta:
764 kernel_image_settings.url = self.glance_test_meta[
766 self.image_creators.append(
767 create_image.OpenStackImage(self.os_creds,
768 kernel_image_settings))
769 kernel_image = self.image_creators[-1].create()
770 self.assertIsNotNone(kernel_image)
771 self.assertEqual(get_image_size(kernel_image_settings),
774 # Create the ramdisk image
775 ramdisk_image_settings = openstack_tests.cirros_image_settings(
776 name=self.image_name + '_ramdisk',
777 url=openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL)
778 if self.glance_test_meta:
779 if 'ramdisk_url' in self.glance_test_meta:
780 ramdisk_image_settings.url = self.glance_test_meta[
782 self.image_creators.append(
783 create_image.OpenStackImage(self.os_creds,
784 ramdisk_image_settings))
785 ramdisk_image = self.image_creators[-1].create()
786 self.assertIsNotNone(ramdisk_image)
787 self.assertEqual(get_image_size(ramdisk_image_settings),
790 # Create the main image
791 os_image_settings = openstack_tests.cirros_image_settings(
792 name=self.image_name,
793 url=openstack_tests.CIRROS_DEFAULT_IMAGE_URL)
794 if self.glance_test_meta:
795 if 'disk_url' in self.glance_test_meta:
796 os_image_settings.url = self.glance_test_meta['disk_url']
798 properties['kernel_id'] = kernel_image.id
799 properties['ramdisk_id'] = ramdisk_image.id
800 os_image_settings.extra_properties = properties
802 self.image_creators.append(
803 create_image.OpenStackImage(self.os_creds, os_image_settings))
804 created_image = self.image_creators[-1].create()
805 self.assertIsNotNone(created_image)
806 self.assertEqual(self.image_name, created_image.name)
808 retrieved_image = glance_utils.get_image(self.glance,
809 os_image_settings.name)
810 self.assertIsNotNone(retrieved_image)
812 self.assertEqual(self.image_creators[-1].get_image().size,
813 retrieved_image.size)
814 self.assertEqual(get_image_size(os_image_settings),
815 retrieved_image.size)
817 self.assertEqual(created_image.name, retrieved_image.name)
818 self.assertEqual(created_image.id, retrieved_image.id)
819 self.assertEqual(created_image.properties,
820 retrieved_image.properties)
823 'Test not executed as the image metadata requires image files')
826 def get_image_size(image_settings):
828 Returns the expected image size
831 if image_settings.image_file:
832 return os.path.getsize(image_settings.image_file)
833 elif image_settings.url:
834 return int(file_utils.get_content_length(image_settings.url))
837 'Cannot retrieve expected image size. Image filename or URL has '
838 'not been configured')