summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2013-02-07 09:55:33 -0800
committerVishvananda Ishaya <vishvananda@gmail.com>2013-02-12 09:00:13 -0800
commit64fcd4de113dea91cd36e0fb8ed74f001089a3a9 (patch)
treeec9fa3709b7cb9a1910e7bfff601bc1d85ebfbcc /nova/api
parentb64c53e0368ea63d8cd4beb71dabce9987b9bb54 (diff)
downloadnova-64fcd4de113dea91cd36e0fb8ed74f001089a3a9.tar.gz
nova-64fcd4de113dea91cd36e0fb8ed74f001089a3a9.tar.xz
nova-64fcd4de113dea91cd36e0fb8ed74f001089a3a9.zip
Add an extension to show the type of an ip.
There is currently no way to differentiate a fixed ip from a floating ip in the servers list. This extension adds the OS-EXT-IPS:type param so that users can determine if it is a fixed address or a floating address. Fixes bug 1117784 DocImpact Change-Id: I8709a4f2f6792faa3d8e0cdcd330d751ef6633ae
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/compute/contrib/extended_ips.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/nova/api/openstack/compute/contrib/extended_ips.py b/nova/api/openstack/compute/contrib/extended_ips.py
new file mode 100644
index 000000000..0a3432a46
--- /dev/null
+++ b/nova/api/openstack/compute/contrib/extended_ips.py
@@ -0,0 +1,111 @@
+# Copyright 2013 Nebula, Inc.
+#
+# 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 Extended Ips API extension."""
+
+import itertools
+
+from nova.api.openstack import common
+from nova.api.openstack.compute import ips
+from nova.api.openstack import extensions
+from nova.api.openstack import wsgi
+from nova.api.openstack import xmlutil
+from nova import compute
+from nova.openstack.common import log as logging
+
+LOG = logging.getLogger(__name__)
+authorize = extensions.soft_extension_authorizer('compute', 'extended_ips')
+
+
+class ExtendedIpsController(wsgi.Controller):
+ def __init__(self, *args, **kwargs):
+ super(ExtendedIpsController, self).__init__(*args, **kwargs)
+ self.compute_api = compute.API()
+
+ def _extend_server(self, context, server, instance):
+ key = "%s:type" % Extended_ips.alias
+ networks = common.get_networks_for_instance(context, instance)
+ for label, network in networks.items():
+ # NOTE(vish): ips are hidden in some states via the
+ # hide_server_addresses extension.
+ if label in server['addresses']:
+ all_ips = itertools.chain(network["ips"],
+ network["floating_ips"])
+ for i, ip in enumerate(all_ips):
+ server['addresses'][label][i][key] = ip['type']
+
+ @wsgi.extends
+ def show(self, req, resp_obj, id):
+ context = req.environ['nova.context']
+ if authorize(context):
+ # Attach our slave template to the response object
+ resp_obj.attach(xml=ExtendedIpsServerTemplate())
+ server = resp_obj.obj['server']
+ db_instance = req.get_db_instance(server['id'])
+ # server['id'] is guaranteed to be in the cache due to
+ # the core API adding it in its 'show' method.
+ self._extend_server(context, server, db_instance)
+
+ @wsgi.extends
+ def detail(self, req, resp_obj):
+ context = req.environ['nova.context']
+ if authorize(context):
+ # Attach our slave template to the response object
+ resp_obj.attach(xml=ExtendedIpsServersTemplate())
+ servers = list(resp_obj.obj['servers'])
+ for server in servers:
+ db_instance = req.get_db_instance(server['id'])
+ # server['id'] is guaranteed to be in the cache due to
+ # the core API adding it in its 'detail' method.
+ self._extend_server(context, server, db_instance)
+
+
+class Extended_ips(extensions.ExtensionDescriptor):
+ """Adds type parameter to the ip list."""
+
+ name = "ExtendedIps"
+ alias = "OS-EXT-IPS"
+ namespace = ("http://docs.openstack.org/compute/ext/"
+ "extended_ips/api/v1.1")
+ updated = "2013-01-06T00:00:00+00:00"
+
+ def get_controller_extensions(self):
+ controller = ExtendedIpsController()
+ extension = extensions.ControllerExtension(self, 'servers', controller)
+ return [extension]
+
+
+def make_server(elem):
+ elem.append(ips.AddressesTemplate())
+ ip = elem['addresses']['network']['ip']
+ ip.set('{%s}type' % Extended_ips.namespace,
+ '%s:type' % Extended_ips.alias)
+
+
+class ExtendedIpsServerTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('server', selector='server')
+ elem = xmlutil.SubTemplateElement(root, 'server', selector='servers')
+ make_server(root)
+ return xmlutil.SlaveTemplate(root, 1, nsmap={
+ Extended_ips.alias: Extended_ips.namespace})
+
+
+class ExtendedIpsServersTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('servers')
+ elem = xmlutil.SubTemplateElement(root, 'server', selector='servers')
+ make_server(elem)
+ return xmlutil.SlaveTemplate(root, 1, nsmap={
+ Extended_ips.alias: Extended_ips.namespace})