diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-05-31 14:51:08 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-05-31 14:51:08 +0000 |
| commit | 9ca2673bef0d6a883df673fb6531640c8f268a44 (patch) | |
| tree | d28285c66aaa3f66a2da8615ff0e195c793880b2 /nova/api | |
| parent | c70cbb43fc670d7f1390e65a96dd48b7cd5aa7bd (diff) | |
| parent | 39b8641fc44dc5a91ff1d4e758fb16a6d0979eea (diff) | |
| download | nova-9ca2673bef0d6a883df673fb6531640c8f268a44.tar.gz nova-9ca2673bef0d6a883df673fb6531640c8f268a44.tar.xz nova-9ca2673bef0d6a883df673fb6531640c8f268a44.zip | |
Merge "Ports ips api to v3 API"
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): |
