From abec25a7bafa4ca320ae222a34fc45ad3c1d27a8 Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi Date: Mon, 30 Sep 2013 13:24:24 +0900 Subject: [PATCH] Fix the image name of a shelved server The shelve feature powers a server off, and creates a snapshot of the server. The snapshot image name is "instance-XXXXXXXXX-shelved" and it doesn't contain a server name like the following: $ nova list +----+------+--------+------------+-------------+------------------+ | ID | Name | Status | Task State | Power State | Networks | +----+------+--------+------------+-------------+------------------+ | .. | vm01 | ACTIVE | None | Running | private=10.0.0.5 | +----+------+--------+------------+-------------+------------------+ $ nova shelve vm01 $ nova image-list +----+---------------------------------+--------+--------+ | ID | Name | Status | Server | +----+---------------------------------+--------+--------+ | .. | instance-00000004-shelved | ACTIVE | .. | +----+---------------------------------+--------+--------+ $ "instance-XXXXXXXXX" is OS-EXT-SRV-ATTR:instance_name, and a non-admin cannot see it. This patch changes the name to "-shelved", so that a non- admin user can know the server name of a shelved image: $ nova image-list +----+--------------------+--------+--------+ | ID | Name | Status | Server | +----+--------------------+--------+--------+ | .. | vm01-shelved | ACTIVE | .. | +----+--------------------+--------+--------+ $ Closes-Bug: 1232991 Change-Id: Idc73658e29cb77dfcc8b046535a36affc1831605 --- nova/compute/api.py | 2 +- nova/tests/compute/test_shelve.py | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 3d08080bb27a..da9f83970920 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -2367,7 +2367,7 @@ class API(base.Base): image_id = None if not self.is_volume_backed_instance(context, instance): - name = '%s-shelved' % instance['name'] + name = '%s-shelved' % instance['display_name'] image_meta = self._create_image(context, instance, name, 'snapshot') image_id = image_meta['id'] diff --git a/nova/tests/compute/test_shelve.py b/nova/tests/compute/test_shelve.py index 804f2fc19635..4518090498f3 100644 --- a/nova/tests/compute/test_shelve.py +++ b/nova/tests/compute/test_shelve.py @@ -315,12 +315,28 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): class ShelveComputeAPITestCase(test_compute.BaseTestCase): def test_shelve(self): # Ensure instance can be shelved. - instance = jsonutils.to_primitive(self._create_fake_instance()) + fake_instance = self._create_fake_instance({'display_name': 'vm01'}) + instance = jsonutils.to_primitive(fake_instance) instance_uuid = instance['uuid'] self.compute.run_instance(self.context, instance=instance) self.assertEqual(instance['task_state'], None) + def fake_init(self2): + # In original _FakeImageService.__init__(), some fake images are + # created. To verify the snapshot name of this test only, here + # sets a fake method. + self2.images = {} + + def fake_create(self2, ctxt, metadata): + self.assertEqual(metadata['name'], 'vm01-shelved') + metadata['id'] = '8b24ed3f-ee57-43bc-bc2e-fb2e9482bc42' + return metadata + + fake_image.stub_out_image_service(self.stubs) + self.stubs.Set(fake_image._FakeImageService, '__init__', fake_init) + self.stubs.Set(fake_image._FakeImageService, 'create', fake_create) + inst_obj = instance_obj.Instance.get_by_uuid(self.context, instance_uuid) self.compute_api.shelve(self.context, inst_obj)