diff options
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/compute/plugins/v3/ips.py | 116 | ||||
| -rw-r--r-- | nova/api/openstack/compute/plugins/v3/servers.py | 2 |
2 files changed, 117 insertions, 1 deletions
diff --git a/nova/api/openstack/compute/plugins/v3/ips.py b/nova/api/openstack/compute/plugins/v3/ips.py new file mode 100644 index 000000000..2d9a4891d --- /dev/null +++ b/nova/api/openstack/compute/plugins/v3/ips.py @@ -0,0 +1,116 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation +# 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. + +from webob import exc + +import nova +from nova.api.openstack import common +from nova.api.openstack.compute.views import addresses as view_addresses +from nova.api.openstack import extensions +from nova.api.openstack import wsgi +from nova.api.openstack import xmlutil + + +def make_network(elem): + elem.set('id', 0) + + ip = xmlutil.SubTemplateElement(elem, 'ip', selector=1) + ip.set('version') + ip.set('addr') + + +network_nsmap = {None: xmlutil.XMLNS_V11} + + +class NetworkTemplate(xmlutil.TemplateBuilder): + def construct(self): + sel = xmlutil.Selector(xmlutil.get_items, 0) + root = xmlutil.TemplateElement('network', selector=sel) + make_network(root) + return xmlutil.MasterTemplate(root, 1, nsmap=network_nsmap) + + +class AddressesTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('addresses', selector='addresses') + elem = xmlutil.SubTemplateElement(root, 'network', + selector=xmlutil.get_items) + make_network(elem) + return xmlutil.MasterTemplate(root, 1, nsmap=network_nsmap) + + +class IPsController(wsgi.Controller): + """The servers addresses API controller for the OpenStack API.""" + + _view_builder_class = view_addresses.ViewBuilder + + def __init__(self, **kwargs): + super(IPsController, self).__init__(**kwargs) + self._compute_api = nova.compute.API() + + def _get_instance(self, context, server_id): + try: + instance = self._compute_api.get(context, server_id) + except nova.exception.NotFound: + msg = _("Instance does not exist") + raise exc.HTTPNotFound(explanation=msg) + return instance + + def create(self, req, server_id, body): + raise exc.HTTPNotImplemented() + + def delete(self, req, server_id, id): + raise exc.HTTPNotImplemented() + + @wsgi.serializers(xml=AddressesTemplate) + def index(self, req, server_id): + context = req.environ["nova.context"] + instance = self._get_instance(context, server_id) + networks = common.get_networks_for_instance(context, instance) + return self._view_builder.index(networks) + + @wsgi.serializers(xml=NetworkTemplate) + def show(self, req, server_id, id): + context = req.environ["nova.context"] + instance = self._get_instance(context, server_id) + networks = common.get_networks_for_instance(context, instance) + if id not in networks: + msg = _("Instance is not a member of specified network") + raise exc.HTTPNotFound(explanation=msg) + + return self._view_builder.show(networks[id], id) + + +class IPs(extensions.V3APIExtensionBase): + """Server addresses.""" + + name = "ips" + alias = "ips" + namespace = "http://docs.openstack.org/compute/core/ips/v3" + version = 1 + + def get_resources(self): + parent = {'member_name': 'server', + 'collection_name': 'servers'} + resources = [ + extensions.ResourceExtension( + 'ips', IPsController(), parent=parent, member_name='ip')] + + return resources + + def get_controller_extensions(self): + return [] diff --git a/nova/api/openstack/compute/plugins/v3/servers.py b/nova/api/openstack/compute/plugins/v3/servers.py index 2475af0e4..d9b2d4a3b 100644 --- a/nova/api/openstack/compute/plugins/v3/servers.py +++ b/nova/api/openstack/compute/plugins/v3/servers.py @@ -1492,7 +1492,7 @@ class ServersController(wsgi.Controller): def _get_server_search_options(self): """Return server search options allowed by non-admin.""" return ('reservation_id', 'name', 'status', 'image', 'flavor', - 'changes-since', 'all_tenants') + 'ip', 'changes-since', 'all_tenants') def remove_invalid_options(context, search_options, allowed_search_options): |
