summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorEd Leafe <ed@leafe.com>2011-08-04 19:32:10 +0000
committerEd Leafe <ed@leafe.com>2011-08-04 19:32:10 +0000
commit6ff2d660d777087b1a83550e81b1df24aea8f7a5 (patch)
treec5dda46199800ffde7f2f25651fc5df91af79d76 /nova/api
parent3f7c71fd38a67e6983de0bb268e5c65abc5753f4 (diff)
parent7b69ef4fe1e4aabcf44789455b96492b168ad6f5 (diff)
Added xenhost config get/setting.
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/contrib/admin_only.py30
-rw-r--r--nova/api/openstack/contrib/hosts.py42
-rw-r--r--nova/api/openstack/create_instance_helper.py2
3 files changed, 71 insertions, 3 deletions
diff --git a/nova/api/openstack/contrib/admin_only.py b/nova/api/openstack/contrib/admin_only.py
new file mode 100644
index 000000000..e821c9e1f
--- /dev/null
+++ b/nova/api/openstack/contrib/admin_only.py
@@ -0,0 +1,30 @@
+# Copyright (c) 2011 Openstack, LLC.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""Decorator for limiting extensions that should be admin-only."""
+
+from functools import wraps
+from nova import flags
+FLAGS = flags.FLAGS
+
+
+def admin_only(fnc):
+ @wraps(fnc)
+ def _wrapped(self, *args, **kwargs):
+ if FLAGS.allow_admin_api:
+ return fnc(self, *args, **kwargs)
+ return []
+ _wrapped.func_name = fnc.func_name
+ return _wrapped
diff --git a/nova/api/openstack/contrib/hosts.py b/nova/api/openstack/contrib/hosts.py
index 55e57e1a4..ddb611905 100644
--- a/nova/api/openstack/contrib/hosts.py
+++ b/nova/api/openstack/contrib/hosts.py
@@ -24,6 +24,7 @@ from nova import log as logging
from nova.api.openstack import common
from nova.api.openstack import extensions
from nova.api.openstack import faults
+from nova.api.openstack.contrib import admin_only
from nova.scheduler import api as scheduler_api
@@ -64,6 +65,13 @@ class HostController(object):
def index(self, req):
return {'hosts': _list_hosts(req)}
+ def show(self, req, id):
+ """Check the query vars for values to be returned from the host config
+ settings. Return a dict with the query var as the key and the config
+ setting as the value.
+ """
+ return {"PARAMS": req.params.keys()}
+
@check_host
def update(self, req, id, body):
for raw_key, raw_val in body.iteritems():
@@ -78,6 +86,20 @@ class HostController(object):
else:
explanation = _("Invalid status: '%s'") % raw_val
raise webob.exc.HTTPBadRequest(explanation=explanation)
+ elif key == "power_state":
+ if val == "startup":
+ # The only valid values for 'state' are 'reboot' or
+ # 'shutdown'. For completeness' sake there is the
+ # 'startup' option to start up a host, but this is not
+ # technically feasible now, as we run the host on the
+ # XenServer box.
+ msg = _("Host startup on XenServer is not supported.")
+ raise webob.exc.HTTPBadRequest(explanation=msg)
+ elif val in ("reboot", "shutdown"):
+ return self._set_powerstate(req, id, val)
+ else:
+ explanation = _("Invalid powerstate: '%s'") % raw_val
+ raise webob.exc.HTTPBadRequest(explanation=explanation)
else:
explanation = _("Invalid update setting: '%s'") % raw_key
raise webob.exc.HTTPBadRequest(explanation=explanation)
@@ -89,8 +111,18 @@ class HostController(object):
LOG.audit(_("Setting host %(host)s to %(state)s.") % locals())
result = self.compute_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)
return {"host": host, "status": result}
+ def _set_powerstate(self, req, host, state):
+ """Reboots or shuts down the host."""
+ context = req.environ['nova.context']
+ result = self.compute_api.set_host_powerstate(context, host=host,
+ state=state)
+ return {"host": host, "power_state": result}
+
class Hosts(extensions.ExtensionDescriptor):
def get_name(self):
@@ -108,7 +140,13 @@ class Hosts(extensions.ExtensionDescriptor):
def get_updated(self):
return "2011-06-29T00:00:00+00:00"
+ @admin_only.admin_only
def get_resources(self):
- resources = [extensions.ResourceExtension('os-hosts', HostController(),
- collection_actions={'update': 'PUT'}, member_actions={})]
+ resources = []
+ # If we are not in an admin env, don't add the resource. Regular users
+ # shouldn't have access to the host.
+ if FLAGS.allow_admin_api:
+ resources = [extensions.ResourceExtension('os-hosts',
+ HostController(), collection_actions={'update': 'PUT'},
+ member_actions={})]
return resources
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index a2d18d37e..333994fcc 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -92,7 +92,7 @@ class CreateInstanceHelper(object):
image_href = self.controller._image_ref_from_req_data(body)
# If the image href was generated by nova api, strip image_href
# down to an id and use the default glance connection params
-
+
if str(image_href).startswith(req.application_url):
image_href = image_href.split('/').pop()
try: