diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-03-15 15:28:38 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-03-15 15:28:38 +0000 |
commit | d802d807049478d1fe30dedcbcdae28f666e61b3 (patch) | |
tree | 9ea7902a832f9fd56b4939e7cdd9ee091fdee6c4 /nova | |
parent | 63c1d5e6fadca26226f17cb7bcd6400553f6cfa7 (diff) | |
parent | 5f46f6acf3a000c8e65ee6f2574aff518b036d29 (diff) | |
download | nova-d802d807049478d1fe30dedcbcdae28f666e61b3.tar.gz nova-d802d807049478d1fe30dedcbcdae28f666e61b3.tar.xz nova-d802d807049478d1fe30dedcbcdae28f666e61b3.zip |
Merge "Fixes instance task_state being left as migrating"
Diffstat (limited to 'nova')
-rw-r--r-- | nova/api/openstack/compute/contrib/admin_actions.py | 5 | ||||
-rw-r--r-- | nova/scheduler/manager.py | 5 | ||||
-rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_admin_actions.py | 114 |
3 files changed, 122 insertions, 2 deletions
diff --git a/nova/api/openstack/compute/contrib/admin_actions.py b/nova/api/openstack/compute/contrib/admin_actions.py index 8e5863706..951bc0c11 100644 --- a/nova/api/openstack/compute/contrib/admin_actions.py +++ b/nova/api/openstack/compute/contrib/admin_actions.py @@ -282,7 +282,10 @@ class AdminActionsController(wsgi.Controller): instance = self.compute_api.get(context, id) self.compute_api.live_migrate(context, instance, block_migration, disk_over_commit, host) - except exception.ComputeServiceUnavailable as ex: + except (exception.ComputeServiceUnavailable, + exception.InvalidHypervisorType, + exception.UnableToMigrateToSelf, + exception.DestinationHypervisorTooOld) as ex: raise exc.HTTPBadRequest(explanation=str(ex)) except Exception: if host is None: diff --git a/nova/scheduler/manager.py b/nova/scheduler/manager.py index 1303cce00..87b0a39c6 100644 --- a/nova/scheduler/manager.py +++ b/nova/scheduler/manager.py @@ -94,7 +94,10 @@ class SchedulerManager(manager.Manager): return self.driver.schedule_live_migration( context, instance, dest, block_migration, disk_over_commit) - except exception.ComputeServiceUnavailable as ex: + except (exception.ComputeServiceUnavailable, + exception.InvalidHypervisorType, + exception.UnableToMigrateToSelf, + exception.DestinationHypervisorTooOld) as ex: request_spec = {'instance_properties': { 'uuid': instance['uuid'], }, } diff --git a/nova/tests/api/openstack/compute/contrib/test_admin_actions.py b/nova/tests/api/openstack/compute/contrib/test_admin_actions.py index bb3cbf086..2efb6fe5a 100644 --- a/nova/tests/api/openstack/compute/contrib/test_admin_actions.py +++ b/nova/tests/api/openstack/compute/contrib/test_admin_actions.py @@ -211,6 +211,120 @@ class AdminActionsTest(test.TestCase): unicode(exception.ComputeServiceUnavailable(host='host')), res.body) + def test_migrate_live_invalid_hypervisor_type(self): + ctxt = context.get_admin_context() + ctxt.user_id = 'fake' + ctxt.project_id = 'fake' + ctxt.is_admin = True + app = fakes.wsgi_app(fake_auth_context=ctxt, init_only=('servers',)) + req = webob.Request.blank('/v2/fake/servers/%s/action' % self.UUID) + req.method = 'POST' + req.body = jsonutils.dumps({ + 'os-migrateLive': { + 'host': 'hostname', + 'block_migration': False, + 'disk_over_commit': False, + } + }) + req.content_type = 'application/json' + + def fake_update(inst, context, instance, + task_state, expected_task_state): + return None + + def fake_scheduler_api_live_migration(context, dest, + block_migration=False, + disk_over_commit=False, instance=None, + instance_id=None, topic=None): + raise exception.InvalidHypervisorType() + + self.stubs.Set(compute_api.API, 'update', fake_update) + self.stubs.Set(scheduler_rpcapi.SchedulerAPI, + 'live_migration', + fake_scheduler_api_live_migration) + + res = req.get_response(app) + self.assertEqual(res.status_int, 400) + self.assertIn( + unicode(exception.InvalidHypervisorType()), + res.body) + + def test_migrate_live_unable_to_migrate_to_self(self): + ctxt = context.get_admin_context() + ctxt.user_id = 'fake' + ctxt.project_id = 'fake' + ctxt.is_admin = True + app = fakes.wsgi_app(fake_auth_context=ctxt, init_only=('servers',)) + req = webob.Request.blank('/v2/fake/servers/%s/action' % self.UUID) + req.method = 'POST' + req.body = jsonutils.dumps({ + 'os-migrateLive': { + 'host': 'hostname', + 'block_migration': False, + 'disk_over_commit': False, + } + }) + req.content_type = 'application/json' + + def fake_update(inst, context, instance, + task_state, expected_task_state): + return None + + def fake_scheduler_api_live_migration(context, dest, + block_migration=False, + disk_over_commit=False, instance=None, + instance_id=None, topic=None): + raise exception.UnableToMigrateToSelf(self.UUID, host='host') + + self.stubs.Set(compute_api.API, 'update', fake_update) + self.stubs.Set(scheduler_rpcapi.SchedulerAPI, + 'live_migration', + fake_scheduler_api_live_migration) + + res = req.get_response(app) + self.assertEqual(res.status_int, 400) + self.assertIn( + unicode(exception.UnableToMigrateToSelf(self.UUID, host='host')), + res.body) + + def test_migrate_live_destination_hypervisor_too_old(self): + ctxt = context.get_admin_context() + ctxt.user_id = 'fake' + ctxt.project_id = 'fake' + ctxt.is_admin = True + app = fakes.wsgi_app(fake_auth_context=ctxt, init_only=('servers',)) + req = webob.Request.blank('/v2/fake/servers/%s/action' % self.UUID) + req.method = 'POST' + req.body = jsonutils.dumps({ + 'os-migrateLive': { + 'host': 'hostname', + 'block_migration': False, + 'disk_over_commit': False, + } + }) + req.content_type = 'application/json' + + def fake_update(inst, context, instance, + task_state, expected_task_state): + return None + + def fake_scheduler_api_live_migration(context, dest, + block_migration=False, + disk_over_commit=False, instance=None, + instance_id=None, topic=None): + raise exception.DestinationHypervisorTooOld() + + self.stubs.Set(compute_api.API, 'update', fake_update) + self.stubs.Set(scheduler_rpcapi.SchedulerAPI, + 'live_migration', + fake_scheduler_api_live_migration) + + res = req.get_response(app) + self.assertEqual(res.status_int, 400) + self.assertIn( + unicode(exception.DestinationHypervisorTooOld()), + res.body) + class CreateBackupTests(test.TestCase): |