summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-06-28 17:52:59 +0000
committerGerrit Code Review <review@openstack.org>2012-06-28 17:52:59 +0000
commit10f7f239acd740565cf8d2277a5a64df85308061 (patch)
tree961f0e062f933e9bba7476ec64217228cf11dee8 /nova/api
parentbc22a271027ef61bcdb43faeacee2be400d874f8 (diff)
parent3d1105f21e4edb0f44e25677775ee58d5a6ab1f3 (diff)
Merge "Add hypervisor information extension."
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/compute/contrib/hypervisors.py192
1 files changed, 192 insertions, 0 deletions
diff --git a/nova/api/openstack/compute/contrib/hypervisors.py b/nova/api/openstack/compute/contrib/hypervisors.py
new file mode 100644
index 000000000..6686de5a9
--- /dev/null
+++ b/nova/api/openstack/compute/contrib/hypervisors.py
@@ -0,0 +1,192 @@
+# Copyright (c) 2012 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.
+
+"""The hypervisors admin extension."""
+
+import webob.exc
+
+from nova.api.openstack import extensions
+from nova.api.openstack import wsgi
+from nova.api.openstack import xmlutil
+from nova import db
+from nova import exception
+from nova import log as logging
+
+
+LOG = logging.getLogger(__name__)
+authorize = extensions.extension_authorizer('compute', 'hypervisors')
+
+
+def make_hypervisor(elem, detail):
+ elem.set('hypervisor_hostname')
+ elem.set('id')
+ if detail:
+ elem.set('vcpus')
+ elem.set('memory_mb')
+ elem.set('local_gb')
+ elem.set('vcpus_used')
+ elem.set('memory_mb_used')
+ elem.set('local_gb_used')
+ elem.set('hypervisor_type')
+ elem.set('hypervisor_version')
+ elem.set('free_ram_mb')
+ elem.set('free_disk_gb')
+ elem.set('current_workload')
+ elem.set('running_vms')
+ elem.set('cpu_info')
+ elem.set('disk_available_least')
+
+ service = xmlutil.SubTemplateElement(elem, 'service',
+ selector='service')
+ service.set('id')
+ service.set('host')
+
+
+class HypervisorIndexTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('hypervisors')
+ elem = xmlutil.SubTemplateElement(root, 'hypervisor',
+ selector='hypervisors')
+ make_hypervisor(elem, False)
+ return xmlutil.MasterTemplate(root, 1)
+
+
+class HypervisorDetailTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('hypervisors')
+ elem = xmlutil.SubTemplateElement(root, 'hypervisor',
+ selector='hypervisors')
+ make_hypervisor(elem, True)
+ return xmlutil.MasterTemplate(root, 1)
+
+
+class HypervisorTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('hypervisor', selector='hypervisor')
+ make_hypervisor(root, True)
+ return xmlutil.MasterTemplate(root, 1)
+
+
+class HypervisorServersTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('hypervisors')
+ elem = xmlutil.SubTemplateElement(root, 'hypervisor',
+ selector='hypervisors')
+ make_hypervisor(elem, False)
+
+ servers = xmlutil.SubTemplateElement(elem, 'servers')
+ server = xmlutil.SubTemplateElement(servers, 'server',
+ selector='servers')
+ server.set('name')
+ server.set('uuid')
+
+ return xmlutil.MasterTemplate(root, 1)
+
+
+class HypervisorsController(object):
+ """The Hypervisors API controller for the OpenStack API."""
+
+ def _view_hypervisor(self, hypervisor, detail, servers=None):
+ hyp_dict = {
+ 'id': hypervisor['id'],
+ 'hypervisor_hostname': hypervisor['hypervisor_hostname'],
+ }
+
+ if detail and not servers:
+ for field in ('vcpus', 'memory_mb', 'local_gb', 'vcpus_used',
+ 'memory_mb_used', 'local_gb_used',
+ 'hypervisor_type', 'hypervisor_version',
+ 'free_ram_mb', 'free_disk_gb', 'current_workload',
+ 'running_vms', 'cpu_info', 'disk_available_least'):
+ hyp_dict[field] = hypervisor[field]
+
+ hyp_dict['service'] = {
+ 'id': hypervisor['service_id'],
+ 'host': hypervisor['service']['host'],
+ }
+
+ if servers:
+ hyp_dict['servers'] = [dict(name=serv['name'], uuid=serv['uuid'])
+ for serv in servers]
+
+ return hyp_dict
+
+ @wsgi.serializers(xml=HypervisorIndexTemplate)
+ def index(self, req):
+ context = req.environ['nova.context']
+ authorize(context)
+ return dict(hypervisors=[self._view_hypervisor(hyp, False)
+ for hyp in db.compute_node_get_all(context)])
+
+ @wsgi.serializers(xml=HypervisorDetailTemplate)
+ def detail(self, req):
+ context = req.environ['nova.context']
+ authorize(context)
+ return dict(hypervisors=[self._view_hypervisor(hyp, True)
+ for hyp in db.compute_node_get_all(context)])
+
+ @wsgi.serializers(xml=HypervisorTemplate)
+ def show(self, req, id):
+ context = req.environ['nova.context']
+ authorize(context)
+ try:
+ hyp = db.compute_node_get(context, int(id))
+ except (ValueError, exception.ComputeHostNotFound):
+ msg = _("Hypervisor with ID '%s' could not be found.") % id
+ raise webob.exc.HTTPNotFound(explanation=msg)
+ return dict(hypervisor=self._view_hypervisor(hyp, True))
+
+ @wsgi.serializers(xml=HypervisorIndexTemplate)
+ def search(self, req, id):
+ context = req.environ['nova.context']
+ authorize(context)
+ hypervisors = db.compute_node_search_by_hypervisor(context, id)
+ if hypervisors:
+ return dict(hypervisors=[self._view_hypervisor(hyp, False)
+ for hyp in hypervisors])
+ else:
+ msg = _("No hypervisor matching '%s' could be found.") % id
+ raise webob.exc.HTTPNotFound(explanation=msg)
+
+ @wsgi.serializers(xml=HypervisorServersTemplate)
+ def servers(self, req, id):
+ context = req.environ['nova.context']
+ authorize(context)
+ hypervisors = db.compute_node_search_by_hypervisor(context, id)
+ if hypervisors:
+ return dict(hypervisors=[self._view_hypervisor(hyp, False,
+ db.instance_get_all_by_host(context,
+ hyp['service']['host']))
+ for hyp in hypervisors])
+ else:
+ msg = _("No hypervisor matching '%s' could be found.") % id
+ raise webob.exc.HTTPNotFound(explanation=msg)
+
+
+class Hypervisors(extensions.ExtensionDescriptor):
+ """Admin-only hypervisor administration"""
+
+ name = "Hypervisors"
+ alias = "os-hypervisors"
+ namespace = "http://docs.openstack.org/compute/ext/hypervisors/api/v1.1"
+ updated = "2012-06-21T00:00:00+00:00"
+
+ def get_resources(self):
+ resources = [extensions.ResourceExtension('os-hypervisors',
+ HypervisorsController(),
+ collection_actions={'detail': 'GET'},
+ member_actions={'search': 'GET', 'servers': 'GET'})]
+
+ return resources