Merge "Fix 'nova-manage image_property set' command"
This commit is contained in:
@@ -3336,6 +3336,8 @@ class ImagePropertyCommands:
|
|||||||
# fields currently listed by ImageProps. We can't use from_dict to
|
# fields currently listed by ImageProps. We can't use from_dict to
|
||||||
# do this as it silently ignores invalid property keys.
|
# do this as it silently ignores invalid property keys.
|
||||||
for image_property_name in image_properties.keys():
|
for image_property_name in image_properties.keys():
|
||||||
|
if image_property_name.startswith("trait:"):
|
||||||
|
continue
|
||||||
if image_property_name not in objects.ImageMetaProps.fields:
|
if image_property_name not in objects.ImageMetaProps.fields:
|
||||||
raise exception.InvalidImagePropertyName(
|
raise exception.InvalidImagePropertyName(
|
||||||
image_property_name=image_property_name)
|
image_property_name=image_property_name)
|
||||||
|
@@ -4340,6 +4340,60 @@ class ImagePropertyCommandsTestCase(test.NoDBTestCase):
|
|||||||
image_properties=['hw_cdrom_bus'])
|
image_properties=['hw_cdrom_bus'])
|
||||||
self.assertEqual(4, ret, 'return code')
|
self.assertEqual(4, ret, 'return code')
|
||||||
|
|
||||||
|
@mock.patch('nova.objects.RequestSpec.save')
|
||||||
|
@mock.patch('nova.objects.RequestSpec.get_by_instance_uuid')
|
||||||
|
@mock.patch('nova.objects.Instance.get_by_uuid')
|
||||||
|
@mock.patch('nova.context.target_cell')
|
||||||
|
@mock.patch('nova.objects.Instance.save')
|
||||||
|
@mock.patch('nova.objects.InstanceMapping.get_by_instance_uuid',
|
||||||
|
new=mock.Mock(cell_mapping=mock.sentinel.cm))
|
||||||
|
@mock.patch('nova.context.get_admin_context',
|
||||||
|
new=mock.Mock(return_value=mock.sentinel.ctxt))
|
||||||
|
def test_set_image_properties_with_trait_in_property_name(
|
||||||
|
self, mock_instance_save, mock_target_cell, mock_get_instance,
|
||||||
|
mock_get_request_spec, mock_request_spec_save
|
||||||
|
):
|
||||||
|
mock_target_cell.return_value.__enter__.return_value = \
|
||||||
|
mock.sentinel.cctxt
|
||||||
|
mock_get_instance.return_value = objects.Instance(
|
||||||
|
uuid=uuidsentinel.instance,
|
||||||
|
vm_state=obj_fields.InstanceState.STOPPED,
|
||||||
|
system_metadata={
|
||||||
|
'image_hw_disk_bus': 'virtio',
|
||||||
|
},
|
||||||
|
image_ref=''
|
||||||
|
)
|
||||||
|
mock_get_request_spec.return_value = objects.RequestSpec()
|
||||||
|
ret = self.commands.set(
|
||||||
|
instance_uuid=uuidsentinel.instance,
|
||||||
|
image_properties=["trait:CUSTOM_WINDOWS_HOST=required"])
|
||||||
|
self.assertEqual(0, ret, 'return code')
|
||||||
|
img_props = mock_get_instance.return_value.image_meta.properties
|
||||||
|
self.assertIn('CUSTOM_WINDOWS_HOST', img_props.traits_required)
|
||||||
|
|
||||||
|
@mock.patch('nova.objects.Instance.get_by_uuid')
|
||||||
|
@mock.patch('nova.context.target_cell')
|
||||||
|
@mock.patch('nova.objects.InstanceMapping.get_by_instance_uuid',
|
||||||
|
new=mock.Mock(cell_mapping=mock.sentinel.cm))
|
||||||
|
@mock.patch('nova.context.get_admin_context',
|
||||||
|
new=mock.Mock(return_value=mock.sentinel.ctxt))
|
||||||
|
def test_set_image_properties_without_trait_in_property_name(
|
||||||
|
self, mock_target_cell, mock_get_instance
|
||||||
|
):
|
||||||
|
mock_target_cell.return_value.__enter__.return_value = \
|
||||||
|
mock.sentinel.cctxt
|
||||||
|
mock_get_instance.return_value = objects.Instance(
|
||||||
|
uuid=uuidsentinel.instance,
|
||||||
|
vm_state=obj_fields.InstanceState.SHELVED_OFFLOADED,
|
||||||
|
system_metadata={
|
||||||
|
'image_hw_disk_bus': 'virtio',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
ret = self.commands.set(
|
||||||
|
instance_uuid=uuidsentinel.instance,
|
||||||
|
image_properties=['CUSTOM_WINDOWS_HOST=required'])
|
||||||
|
self.assertEqual(5, ret, 'return code')
|
||||||
|
|
||||||
@mock.patch('nova.objects.Instance.get_by_uuid')
|
@mock.patch('nova.objects.Instance.get_by_uuid')
|
||||||
@mock.patch('nova.context.target_cell')
|
@mock.patch('nova.context.target_cell')
|
||||||
@mock.patch('nova.objects.InstanceMapping.get_by_instance_uuid',
|
@mock.patch('nova.objects.InstanceMapping.get_by_instance_uuid',
|
||||||
|
Reference in New Issue
Block a user