diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-04-12 22:53:44 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-04-12 22:53:44 +0000 |
| commit | 4d5267bffcbdb0461b245d59f090a12ea6325e27 (patch) | |
| tree | f2d0dbc92fda3d21d89803ce4e9466b9490b4011 /nova/api | |
| parent | 9dc09d024e90ab8c6146815920afa7db03f04208 (diff) | |
| parent | 262b285a04b00033c84f817b3f1c105afcf914cb (diff) | |
| download | nova-4d5267bffcbdb0461b245d59f090a12ea6325e27.tar.gz nova-4d5267bffcbdb0461b245d59f090a12ea6325e27.tar.xz nova-4d5267bffcbdb0461b245d59f090a12ea6325e27.zip | |
Merge "Add an extension to show the mac address of a ip in server(s)"
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/common.py | 20 | ||||
| -rw-r--r-- | nova/api/openstack/compute/contrib/extended_ips_mac.py | 110 |
2 files changed, 126 insertions, 4 deletions
diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index 6e3d7eabc..24250c0af 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -16,6 +16,7 @@ # under the License. import functools +import itertools import os import re import urlparse @@ -320,6 +321,9 @@ def get_networks_for_instance_from_nw_info(nw_info): networks[label]['ips'].extend(ips) networks[label]['floating_ips'].extend(floaters) + for ip in itertools.chain(networks[label]['ips'], + networks[label]['floating_ips']): + ip['mac_address'] = vif['address'] return networks @@ -328,10 +332,18 @@ def get_networks_for_instance(context, instance): We end up with a data structure like:: - {'public': {'ips': [{'addr': '10.0.0.1', 'version': 4}, - {'addr': '2001::1', 'version': 6}], - 'floating_ips': [{'addr': '172.16.0.1', 'version': 4}, - {'addr': '172.16.2.1', 'version': 4}]}, + {'public': {'ips': [{'address': '10.0.0.1', + 'version': 4, + 'mac_address': 'aa:aa:aa:aa:aa:aa'}, + {'address': '2001::1', + 'version': 6, + 'mac_address': 'aa:aa:aa:aa:aa:aa'}], + 'floating_ips': [{'address': '172.16.0.1', + 'version': 4, + 'mac_address': 'aa:aa:aa:aa:aa:aa'}, + {'address': '172.16.2.1', + 'version': 4, + 'mac_address': 'aa:aa:aa:aa:aa:aa'}]}, ...} """ nw_info = compute_utils.get_nw_info_for_instance(instance) diff --git a/nova/api/openstack/compute/contrib/extended_ips_mac.py b/nova/api/openstack/compute/contrib/extended_ips_mac.py new file mode 100644 index 000000000..a577513fd --- /dev/null +++ b/nova/api/openstack/compute/contrib/extended_ips_mac.py @@ -0,0 +1,110 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2013 IBM Corp. +# +# 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.openstack.common import log as logging + +LOG = logging.getLogger(__name__) +authorize = extensions.soft_extension_authorizer('compute', 'extended_ips_mac') + + +class ExtendedIpsMacController(wsgi.Controller): + def __init__(self, *args, **kwargs): + super(ExtendedIpsMacController, self).__init__(*args, **kwargs) + + def _extend_server(self, context, server, instance): + key = "%s:mac_addr" % Extended_ips_mac.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['mac_address'] + + @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=ExtendedIpsMacServerTemplate()) + 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=ExtendedIpsMacServersTemplate()) + 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_mac(extensions.ExtensionDescriptor): + """Adds mac address parameter to the ip list.""" + + name = "ExtendedIpsMac" + alias = "OS-EXT-IPS-MAC" + namespace = ("http://docs.openstack.org/compute/ext/" + "extended_ips_mac/api/v1.1") + updated = "2013-03-07T00:00:00+00:00" + + def get_controller_extensions(self): + controller = ExtendedIpsMacController() + extension = extensions.ControllerExtension(self, 'servers', controller) + return [extension] + + +def make_server(elem): + elem.append(ips.AddressesTemplate()) + ip = elem['addresses']['network']['ip'] + ip.set('{%s}mac_addr' % Extended_ips_mac.namespace, + '%s:mac_addr' % Extended_ips_mac.alias) + + +class ExtendedIpsMacServerTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('server', selector='server') + make_server(root) + return xmlutil.SlaveTemplate(root, 1, nsmap={ + Extended_ips_mac.alias: Extended_ips_mac.namespace}) + + +class ExtendedIpsMacServersTemplate(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_mac.alias: Extended_ips_mac.namespace}) |
