diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-12-11 17:43:15 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-12-11 17:43:15 +0000 |
| commit | fa49ec0027e864bbe994818ddb0314e0412e3e58 (patch) | |
| tree | e46e586e92d735dc32048092ae2b1fd47577120c | |
| parent | 06c50e0b42bc945d91f5695f3806d958a3e6add9 (diff) | |
| parent | 1dc6c806b32044420bf17d3076dd712185b7ac07 (diff) | |
| download | nova-fa49ec0027e864bbe994818ddb0314e0412e3e58.tar.gz nova-fa49ec0027e864bbe994818ddb0314e0412e3e58.tar.xz nova-fa49ec0027e864bbe994818ddb0314e0412e3e58.zip | |
Merge "Fix handling of unimplemented host actions"
| -rw-r--r-- | nova/api/openstack/compute/contrib/hosts.py | 24 | ||||
| -rw-r--r-- | nova/openstack/common/rpc/__init__.py | 1 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_hosts.py | 36 | ||||
| -rw-r--r-- | nova/virt/hyperv/driver.py | 4 | ||||
| -rw-r--r-- | nova/virt/libvirt/driver.py | 13 | ||||
| -rw-r--r-- | nova/virt/vmwareapi/driver.py | 13 |
6 files changed, 51 insertions, 40 deletions
diff --git a/nova/api/openstack/compute/contrib/hosts.py b/nova/api/openstack/compute/contrib/hosts.py index 0d2b68f11..7da596a78 100644 --- a/nova/api/openstack/compute/contrib/hosts.py +++ b/nova/api/openstack/compute/contrib/hosts.py @@ -176,9 +176,11 @@ class HostController(object): context = req.environ['nova.context'] LOG.audit(_("Putting host %(host)s in maintenance " "mode %(mode)s.") % locals()) - result = self.api.set_host_maintenance(context, host, mode) - if result not in ("on_maintenance", "off_maintenance"): - raise webob.exc.HTTPBadRequest(explanation=result) + try: + result = self.api.set_host_maintenance(context, host, mode) + except NotImplementedError: + msg = _("Virt driver does not implement host maintenance mode.") + raise webob.exc.HTTPNotImplemented(explanation=msg) return {"host": host, "maintenance_mode": result} def _set_enabled_status(self, req, host, enabled): @@ -186,11 +188,12 @@ class HostController(object): context = req.environ['nova.context'] state = "enabled" if enabled else "disabled" LOG.audit(_("Setting host %(host)s to %(state)s.") % locals()) - result = self.api.set_host_enabled(context, host=host, - enabled=enabled) - if result not in ("enabled", "disabled"): - # An error message was returned - raise webob.exc.HTTPBadRequest(explanation=result) + try: + result = self.api.set_host_enabled(context, host=host, + enabled=enabled) + except NotImplementedError: + msg = _("Virt driver does not implement host disabled status.") + raise webob.exc.HTTPNotImplemented(explanation=msg) return {"host": host, "status": result} def _host_power_action(self, req, host, action): @@ -200,8 +203,9 @@ class HostController(object): try: result = self.api.host_power_action(context, host=host, action=action) - except NotImplementedError as e: - raise webob.exc.HTTPBadRequest(explanation=e.msg) + except NotImplementedError: + msg = _("Virt driver does not implement host power management.") + raise webob.exc.HTTPNotImplemented(explanation=msg) return {"host": host, "power_action": result} @wsgi.serializers(xml=HostActionTemplate) diff --git a/nova/openstack/common/rpc/__init__.py b/nova/openstack/common/rpc/__init__.py index bf2b2e9e0..a223e8fde 100644 --- a/nova/openstack/common/rpc/__init__.py +++ b/nova/openstack/common/rpc/__init__.py @@ -50,6 +50,7 @@ rpc_opts = [ default=['nova.openstack.common.exception', 'nova.exception', 'cinder.exception', + 'exceptions', ], help='Modules of exceptions that are permitted to be recreated' 'upon receiving exception data from an rpc call.'), diff --git a/nova/tests/api/openstack/compute/contrib/test_hosts.py b/nova/tests/api/openstack/compute/contrib/test_hosts.py index b91715190..8469c7eba 100644 --- a/nova/tests/api/openstack/compute/contrib/test_hosts.py +++ b/nova/tests/api/openstack/compute/contrib/test_hosts.py @@ -46,6 +46,8 @@ def stub_service_get_all(self, req): def stub_set_host_enabled(context, host, enabled): + if host == "notimplemented": + raise NotImplementedError() # We'll simulate success and failure by assuming # that 'host_c1' always succeeds, and 'host_c2' # always fails @@ -55,6 +57,8 @@ def stub_set_host_enabled(context, host, enabled): def stub_set_host_maintenance(context, host, mode): + if host == "notimplemented": + raise NotImplementedError() # We'll simulate success and failure by assuming # that 'host_c1' always succeeds, and 'host_c2' # always fails @@ -64,6 +68,8 @@ def stub_set_host_maintenance(context, host, mode): def stub_host_power_action(context, host, action): + if host == "notimplemented": + raise NotImplementedError() return action @@ -153,6 +159,23 @@ class HostTestCase(test.TestCase): self._test_host_update('host_c1', 'maintenance_mode', 'disable', 'off_maintenance') + def _test_host_update_notimpl(self, key, val): + def stub_service_get_all_notimpl(self, req): + return [{'host': 'notimplemented', 'topic': None, + 'availability_zone': None}] + self.stubs.Set(db, 'service_get_all', + stub_service_get_all_notimpl) + body = {key: val} + self.assertRaises(webob.exc.HTTPNotImplemented, + self.controller.update, + self.req, 'notimplemented', body=body) + + def test_disable_host_notimpl(self): + self._test_host_update_notimpl('status', 'disable') + + def test_enable_maintenance_notimpl(self): + self._test_host_update_notimpl('maintenance_mode', 'enable') + def test_host_startup(self): result = self.controller.startup(self.req, "host_c1") self.assertEqual(result["power_action"], "startup") @@ -165,6 +188,19 @@ class HostTestCase(test.TestCase): result = self.controller.reboot(self.req, "host_c1") self.assertEqual(result["power_action"], "reboot") + def _test_host_power_action_notimpl(self, method): + self.assertRaises(webob.exc.HTTPNotImplemented, + method, self.req, "notimplemented") + + def test_host_startup_notimpl(self): + self._test_host_power_action_notimpl(self.controller.startup) + + def test_host_shutdown_notimpl(self): + self._test_host_power_action_notimpl(self.controller.shutdown) + + def test_host_reboot_notimpl(self): + self._test_host_power_action_notimpl(self.controller.reboot) + def test_bad_status_value(self): bad_body = {"status": "bad"} self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, diff --git a/nova/virt/hyperv/driver.py b/nova/virt/hyperv/driver.py index 3b0539159..d1b9904c4 100644 --- a/nova/virt/hyperv/driver.py +++ b/nova/virt/hyperv/driver.py @@ -131,10 +131,6 @@ class HyperVDriver(driver.ComputeDriver): def host_power_action(self, host, action): return self._hostops.host_power_action(host, action) - def set_host_enabled(self, host, enabled): - """Sets the specified host's ability to accept new instances.""" - pass - def snapshot(self, context, instance, name): self._snapshotops.snapshot(context, instance, name) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 0802c0e94..708d0598a 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -2812,19 +2812,6 @@ class LibvirtDriver(driver.ComputeDriver): If 'refresh' is True, run update the stats first.""" return self.host_state.get_host_stats(refresh=refresh) - def host_power_action(self, host, action): - """Reboots, shuts down or powers up the host.""" - raise NotImplementedError() - - def host_maintenance_mode(self, host, mode): - """Start/Stop host maintenance window. On start, it triggers - guest VMs evacuation.""" - raise NotImplementedError() - - def set_host_enabled(self, host, enabled): - """Sets the specified host's ability to accept new instances.""" - pass - def get_host_uptime(self, host): """Returns the result of calling "uptime".""" #NOTE(dprince): host seems to be ignored for this call and in diff --git a/nova/virt/vmwareapi/driver.py b/nova/virt/vmwareapi/driver.py index ee97416ec..f6aa91e85 100644 --- a/nova/virt/vmwareapi/driver.py +++ b/nova/virt/vmwareapi/driver.py @@ -199,19 +199,6 @@ class VMWareESXDriver(driver.ComputeDriver): """This method is supported only by libvirt.""" return - def host_power_action(self, host, action): - """Reboots, shuts down or powers up the host.""" - raise NotImplementedError() - - def host_maintenance_mode(self, host, mode): - """Start/Stop host maintenance window. On start, it triggers - guest VMs evacuation.""" - raise NotImplementedError() - - def set_host_enabled(self, host, enabled): - """Sets the specified host's ability to accept new instances.""" - raise NotImplementedError() - def plug_vifs(self, instance, network_info): """Plug VIFs into networks.""" self._vmops.plug_vifs(instance, network_info) |
