summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-03-15 15:28:38 +0000
committerGerrit Code Review <review@openstack.org>2013-03-15 15:28:38 +0000
commitd802d807049478d1fe30dedcbcdae28f666e61b3 (patch)
tree9ea7902a832f9fd56b4939e7cdd9ee091fdee6c4 /nova
parent63c1d5e6fadca26226f17cb7bcd6400553f6cfa7 (diff)
parent5f46f6acf3a000c8e65ee6f2574aff518b036d29 (diff)
downloadnova-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.py5
-rw-r--r--nova/scheduler/manager.py5
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_admin_actions.py114
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):