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 "<server name>-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
This commit is contained in:
@@ -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']
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user