diff options
| author | Brian Waldon <brian.waldon@rackspace.com> | 2011-08-23 19:55:12 +0000 |
|---|---|---|
| committer | Tarmac <> | 2011-08-23 19:55:12 +0000 |
| commit | 731d4e7f7631e8a8a303bef7779e3f0e513332ae (patch) | |
| tree | d2e7a63da33c71187a1dae3cf473e70151d6eb80 | |
| parent | e23eb5aa5c9810f68f3818cd1119e4993b99a297 (diff) | |
| parent | 295bcc8ef70d767bf1539defe1a79a67bdf555ff (diff) | |
| download | nova-731d4e7f7631e8a8a303bef7779e3f0e513332ae.tar.gz nova-731d4e7f7631e8a8a303bef7779e3f0e513332ae.tar.xz nova-731d4e7f7631e8a8a303bef7779e3f0e513332ae.zip | |
Fixes bug that causes 400 status code when an instance wasn't attached to a network.
| -rw-r--r-- | nova/api/openstack/views/addresses.py | 23 | ||||
| -rw-r--r-- | nova/api/openstack/wsgi.py | 6 | ||||
| -rw-r--r-- | nova/tests/api/openstack/test_servers.py | 21 |
3 files changed, 44 insertions, 6 deletions
diff --git a/nova/api/openstack/views/addresses.py b/nova/api/openstack/views/addresses.py index ddbf7a144..8f07a2289 100644 --- a/nova/api/openstack/views/addresses.py +++ b/nova/api/openstack/views/addresses.py @@ -17,9 +17,11 @@ from nova import flags from nova import utils +from nova import log as logging from nova.api.openstack import common FLAGS = flags.FLAGS +LOG = logging.getLogger('nova.api.openstack.views.addresses') class ViewBuilder(object): @@ -48,7 +50,10 @@ class ViewBuilderV11(ViewBuilder): def build(self, interfaces): networks = {} for interface in interfaces: - network_label = interface['network']['label'] + try: + network_label = self._extract_network_label(interface) + except TypeError: + continue if network_label not in networks: networks[network_label] = [] @@ -64,9 +69,14 @@ class ViewBuilderV11(ViewBuilder): return networks - def build_network(self, interfaces, network_label): + def build_network(self, interfaces, requested_network): for interface in interfaces: - if interface['network']['label'] == network_label: + try: + network_label = self._extract_network_label(interface) + except TypeError: + continue + + if network_label == requested_network: ips = list(self._extract_ipv4_addresses(interface)) ipv6 = self._extract_ipv6_address(interface) if ipv6 is not None: @@ -74,6 +84,13 @@ class ViewBuilderV11(ViewBuilder): return {network_label: ips} return None + def _extract_network_label(self, interface): + try: + return interface['network']['label'] + except (TypeError, KeyError) as exc: + LOG.exception(exc) + raise TypeError + def _extract_ipv4_addresses(self, interface): for fixed_ip in interface['fixed_ips']: yield self._build_ip_entity(fixed_ip['address'], 4) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index dc0f1b93e..8641e960a 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -520,6 +520,6 @@ class Resource(wsgi.Application): controller_method = getattr(self.controller, action) try: return controller_method(req=request, **action_args) - except TypeError, exc: - LOG.debug(str(exc)) - return webob.exc.HTTPBadRequest() + except TypeError as exc: + LOG.exception(exc) + return faults.Fault(webob.exc.HTTPBadRequest()) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index aec2ad947..e5c1f2c34 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -771,6 +771,27 @@ class ServersTest(test.TestCase): (ip,) = private_node.getElementsByTagName('ip') self.assertEquals(ip.getAttribute('addr'), private) + # NOTE(bcwaldon): lp830817 + def test_get_server_by_id_malformed_networks_v1_1(self): + ifaces = [ + { + 'network': None, + 'fixed_ips': [ + {'address': '192.168.0.3'}, + {'address': '192.168.0.4'}, + ], + }, + ] + new_return_server = return_server_with_attributes(interfaces=ifaces) + self.stubs.Set(nova.db.api, 'instance_get', new_return_server) + + req = webob.Request.blank('/v1.1/fake/servers/1') + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 200) + res_dict = json.loads(res.body) + self.assertEqual(res_dict['server']['id'], 1) + self.assertEqual(res_dict['server']['name'], 'server1') + def test_get_server_by_id_with_addresses_v1_1(self): self.flags(use_ipv6=True) interfaces = [ |
