diff options
author | Julien Danjou <julien.danjou@enovance.com> | 2012-03-29 11:22:21 +0200 |
---|---|---|
committer | Julien Danjou <julien.danjou@enovance.com> | 2012-04-02 17:41:03 +0200 |
commit | ee2b37877d555bbd02d28606de1bb54d284698c1 (patch) | |
tree | 2821f5dc101080353d7d587e6223044bd48a7a90 | |
parent | a8aa3ffdeb4d171ec8b7b07472ed9008df1efb75 (diff) | |
download | nova-ee2b37877d555bbd02d28606de1bb54d284698c1.tar.gz nova-ee2b37877d555bbd02d28606de1bb54d284698c1.tar.xz nova-ee2b37877d555bbd02d28606de1bb54d284698c1.zip |
Do not fail to build a snapshot if base image is not found
This fixes bug #968066
Change-Id: I1959e4dd7cb19acef54f0e857f4d8b3d40985b77
-rw-r--r-- | nova/tests/test_libvirt.py | 34 | ||||
-rw-r--r-- | nova/virt/libvirt/connection.py | 8 |
2 files changed, 40 insertions, 2 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 4eea7b0b3..ef0307158 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -780,6 +780,40 @@ class LibvirtConnTestCase(test.TestCase): self.assertEquals(snapshot['status'], 'active') self.assertEquals(snapshot['name'], snapshot_name) + @test.skip_if(missing_libvirt(), "Test requires libvirt") + def test_snapshot_no_original_image(self): + self.flags(image_service='nova.image.fake.FakeImageService') + + # Start test + image_service = utils.import_object(FLAGS.image_service) + + # Assign a non-existent image + test_instance = copy.deepcopy(self.test_instance) + test_instance["image_ref"] = '661122aa-1234-dede-fefe-babababababa' + + instance_ref = db.instance_create(self.context, test_instance) + properties = {'instance_id': instance_ref['id'], + 'user_id': str(self.context.user_id)} + snapshot_name = 'test-snap' + sent_meta = {'name': snapshot_name, 'is_public': False, + 'status': 'creating', 'properties': properties} + recv_meta = image_service.create(context, sent_meta) + + self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') + connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.utils, 'execute') + connection.utils.execute = self.fake_execute + + self.mox.ReplayAll() + + conn = connection.LibvirtConnection(False) + conn.snapshot(self.context, instance_ref, recv_meta['id']) + + snapshot = image_service.show(context, recv_meta['id']) + self.assertEquals(snapshot['properties']['image_state'], 'available') + self.assertEquals(snapshot['status'], 'active') + self.assertEquals(snapshot['name'], snapshot_name) + def test_attach_invalid_volume_type(self): self.create_fake_libvirt_mock() connection.LibvirtConnection._conn.lookupByName = self.fake_lookup diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 08a4a6fad..8dde56b60 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -592,7 +592,11 @@ class LibvirtConnection(driver.ComputeDriver): (image_service, image_id) = nova.image.get_image_service( context, instance['image_ref']) - base = image_service.show(context, image_id) + try: + base = image_service.show(context, image_id) + except exception.ImageNotFound: + base = {} + _image_service = nova.image.get_image_service(context, image_href) snapshot_image_service, snapshot_image_id = _image_service snapshot = snapshot_image_service.show(context, snapshot_image_id) @@ -608,7 +612,7 @@ class LibvirtConnection(driver.ComputeDriver): 'ramdisk_id': instance['ramdisk_id'], } } - if 'architecture' in base['properties']: + if 'architecture' in base.get('properties', {}): arch = base['properties']['architecture'] metadata['properties']['architecture'] = arch |