class ShelveControllerTest(test.NoDBTestCase): plugin = shelve_v21 def setUp(self): super().setUp() self.controller = self.plugin.ShelveController() self.req = fakes.HTTPRequest.blank('') @ddt.data( exception.InstanceIsLocked(instance_uuid=uuids.instance), exception.OperationNotSupportedForVTPM(instance_uuid=uuids.instance, operation='foo'), exception.UnexpectedTaskStateError(instance_uuid=uuids.instance, expected=None, actual=task_states.SHELVING), ) @mock.patch('nova.compute.api.API.shelve') @mock.patch('nova.api.openstack.common.get_instance') def test_shelve__http_conflict_error( self, exc, mock_get_instance, mock_shelve, ): mock_get_instance.return_value = (fake_instance.fake_instance_obj( self.req.environ['nova.context'])) mock_shelve.side_effect = exc self.assertRaises(webob.exc.HTTPConflict, self.controller._shelve, self.req, uuids.fake, {}) @mock.patch('nova.api.openstack.common.get_instance') def test_unshelve_locked_server(self, get_instance_mock): get_instance_mock.return_value = (fake_instance.fake_instance_obj( self.req.environ['nova.context'])) self.stub_out('nova.compute.api.API.unshelve', fakes.fake_actions_to_locked_server) self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve, self.req, uuids.fake, body={'unshelve': {}}) @mock.patch('nova.api.openstack.common.get_instance') def test_shelve_offload_locked_server(self, get_instance_mock): get_instance_mock.return_value = (fake_instance.fake_instance_obj( self.req.environ['nova.context'])) self.stub_out('nova.compute.api.API.shelve_offload', fakes.fake_actions_to_locked_server) self.assertRaises(webob.exc.HTTPConflict, self.controller._shelve_offload, self.req, uuids.fake, {})
def test_unexpected_task_state(self): self.mox.StubOutWithMock(self.compute.driver, 'spawn') self.compute.driver.spawn( self.context, self.instance, self.image, self.injected_files, self.admin_pass).AndRaise( exception.UnexpectedTaskStateError(expected=None, actual='deleting')) self.mox.ReplayAll() self.assertRaises(exception.BuildAbortException, self.compute._build_and_run_instance, self.context, self.instance, self.image, self.injected_files, self.admin_pass)
def test_unexpected_task_state(self): self.mox.StubOutWithMock(self.compute.driver, 'spawn') self.mox.StubOutWithMock(conductor_rpcapi.ConductorAPI, 'instance_update') self.compute.driver.spawn(self.context, self.instance, self.image, self.injected_files, self.admin_pass).AndRaise( exception.UnexpectedTaskStateError(expected=None, actual='deleting')) conductor_rpcapi.ConductorAPI.instance_update( self.context, self.instance['uuid'], mox.IgnoreArg(), 'conductor') self.mox.ReplayAll() self.assertRaises(exception.BuildAbortException, self.compute._build_and_run_instance, self.context, self.instance, self.image, self.injected_files, self.admin_pass, self.node, self.limits)
def test_shelve_task_state_race(self, mock_save, get_instance_mock): instance = fake_instance.fake_instance_obj( self.req.environ['nova.context'], vm_state=vm_states.ACTIVE, task_state=None) instance.launched_at = instance.created_at get_instance_mock.return_value = instance mock_save.side_effect = exception.UnexpectedTaskStateError( instance_uuid=instance.uuid, expected=None, actual=task_states.SHELVING) ex = self.assertRaises(webob.exc.HTTPConflict, self.controller._shelve, self.req, uuidsentinel.fake, body={'shelve': {}}) self.assertIn('Conflict updating instance', six.text_type(ex)) mock_save.assert_called_once_with(expected_task_state=[None])