Skip to content

Commit 08bddbd

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Reject resize operation for accelerator"
2 parents 779fd5e + 97267fc commit 08bddbd

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

nova/compute/api.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3945,8 +3945,6 @@ def _validate_host_for_cold_migrate(
39453945

39463946
# TODO(stephenfin): This logic would be so much easier to grok if we
39473947
# finally split resize and cold migration into separate code paths
3948-
# TODO(stephenfin): The 'block_accelerators' decorator doesn't take into
3949-
# account the accelerators requested in the new flavor
39503948
@block_accelerators()
39513949
@check_instance_lock
39523950
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED])
@@ -3982,6 +3980,12 @@ def resize(self, context, instance, flavor_id=None, clean_shutdown=True,
39823980
else:
39833981
new_instance_type = flavors.get_flavor_by_flavor_id(
39843982
flavor_id, read_deleted="no")
3983+
# NOTE(wenping): We use this instead of the 'block_accelerator'
3984+
# decorator since the operation can differ depending on args,
3985+
# and for resize we have two flavors to worry about, we should
3986+
# reject resize with new flavor with accelerator.
3987+
if new_instance_type.extra_specs.get('accel:device_profile'):
3988+
raise exception.ForbiddenWithAccelerators()
39853989
# Check to see if we're resizing to a zero-disk flavor which is
39863990
# only supported with volume-backed servers.
39873991
if (new_instance_type.get('root_gb') == 0 and

nova/tests/unit/compute/test_api.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2166,6 +2166,25 @@ def test_resize__with_vtpm(self, mock_get_flavor):
21662166
mock.call(new_flavor, mock.ANY),
21672167
])
21682168

2169+
@mock.patch('nova.compute.api.API.get_instance_host_status',
2170+
new=mock.Mock(return_value=fields_obj.HostStatus.UP))
2171+
@mock.patch('nova.compute.utils.is_volume_backed_instance',
2172+
new=mock.Mock(return_value=False))
2173+
@mock.patch.object(flavors, 'get_flavor_by_flavor_id')
2174+
def test_resize__with_accelerator(self, mock_get_flavor):
2175+
"""Ensure resizes are rejected if either flavor requests accelerator.
2176+
"""
2177+
fake_inst = self._create_instance_obj()
2178+
new_flavor = self._create_flavor(
2179+
id=200, flavorid='new-flavor-id', name='new_flavor',
2180+
disabled=False, extra_specs={'accel:device_profile': 'dp'})
2181+
mock_get_flavor.return_value = new_flavor
2182+
2183+
self.assertRaises(
2184+
exception.ForbiddenWithAccelerators,
2185+
self.compute_api.resize,
2186+
self.context, fake_inst, flavor_id=new_flavor.flavorid)
2187+
21692188
def _test_migrate(self, *args, **kwargs):
21702189
self._test_resize(*args, flavor_id_passed=False, **kwargs)
21712190

0 commit comments

Comments
 (0)