From 34e310eff24b96bcc27df176bfecbd02ac863e7c Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Sun, 21 Aug 2011 22:59:46 -0400 Subject: fixing bug lp:830817 --- nova/api/openstack/views/addresses.py | 26 +++++++++++++++++++++++--- nova/api/openstack/wsgi.py | 6 +++--- nova/tests/api/openstack/test_servers.py | 21 +++++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/nova/api/openstack/views/addresses.py b/nova/api/openstack/views/addresses.py index ddbf7a144..05028db41 100644 --- a/nova/api/openstack/views/addresses.py +++ b/nova/api/openstack/views/addresses.py @@ -15,11 +15,15 @@ # License for the specific language governing permissions and limitations # under the License. +import traceback + 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 +52,11 @@ 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: + LOG.error(traceback.format_exc()) + continue if network_label not in networks: networks[network_label] = [] @@ -64,9 +72,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 +87,13 @@ class ViewBuilderV11(ViewBuilder): return {network_label: ips} return None + def _extract_network_label(self, interface): + try: + return interface['network']['label'] + except (TypeError, KeyError): + LOG.error(traceback.format_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 0eb47044e..c2185ebfd 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -516,6 +516,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: + LOG.debug(traceback.format_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 437620854..8167c4ace 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -752,6 +752,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/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 = [ -- cgit From 9fc23f1055be435e8a21b999f748a8461552bd13 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Sun, 21 Aug 2011 23:16:26 -0400 Subject: adding import --- nova/api/openstack/wsgi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index c2185ebfd..572aba993 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -1,5 +1,6 @@ import json +import traceback import webob from xml.dom import minidom from xml.parsers import expat -- cgit From 269b4e00e82b8f99d2fc24f935ff165d62f19891 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 22 Aug 2011 16:23:48 -0400 Subject: logging as exception rather than error --- nova/api/openstack/views/addresses.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/views/addresses.py b/nova/api/openstack/views/addresses.py index 05028db41..d54013d61 100644 --- a/nova/api/openstack/views/addresses.py +++ b/nova/api/openstack/views/addresses.py @@ -55,7 +55,7 @@ class ViewBuilderV11(ViewBuilder): try: network_label = self._extract_network_label(interface) except TypeError: - LOG.error(traceback.format_exc()) + LOG.exception(traceback.format_exc()) continue if network_label not in networks: @@ -91,7 +91,7 @@ class ViewBuilderV11(ViewBuilder): try: return interface['network']['label'] except (TypeError, KeyError): - LOG.error(traceback.format_exc()) + LOG.exception(traceback.format_exc()) raise TypeError def _extract_ipv4_addresses(self, interface): -- cgit From d994b06f65af9d4c523a4123f915c6147ada7c05 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 22 Aug 2011 22:00:13 -0400 Subject: fixing exception logging --- nova/api/openstack/views/addresses.py | 9 +++------ nova/api/openstack/wsgi.py | 5 ++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/nova/api/openstack/views/addresses.py b/nova/api/openstack/views/addresses.py index d54013d61..8fccc690f 100644 --- a/nova/api/openstack/views/addresses.py +++ b/nova/api/openstack/views/addresses.py @@ -15,8 +15,6 @@ # License for the specific language governing permissions and limitations # under the License. -import traceback - from nova import flags from nova import utils from nova import log as logging @@ -54,8 +52,7 @@ class ViewBuilderV11(ViewBuilder): for interface in interfaces: try: network_label = self._extract_network_label(interface) - except TypeError: - LOG.exception(traceback.format_exc()) + except TypeError as exc: continue if network_label not in networks: @@ -90,8 +87,8 @@ class ViewBuilderV11(ViewBuilder): def _extract_network_label(self, interface): try: return interface['network']['label'] - except (TypeError, KeyError): - LOG.exception(traceback.format_exc()) + except (TypeError, KeyError) as exc: + LOG.exception(exc) raise TypeError def _extract_ipv4_addresses(self, interface): diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 572aba993..3616c9ec6 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -1,6 +1,5 @@ import json -import traceback import webob from xml.dom import minidom from xml.parsers import expat @@ -517,6 +516,6 @@ class Resource(wsgi.Application): controller_method = getattr(self.controller, action) try: return controller_method(req=request, **action_args) - except TypeError: - LOG.debug(traceback.format_exc()) + except TypeError as exc: + LOG.exception(exc) return faults.Fault(webob.exc.HTTPBadRequest()) -- cgit From 5ad22e341e0ad5ff62e97906edf7822ee53b4ae9 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 22 Aug 2011 23:30:12 -0400 Subject: removing unnecessary tthing --- nova/api/openstack/views/addresses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/api/openstack/views/addresses.py b/nova/api/openstack/views/addresses.py index 8fccc690f..8f07a2289 100644 --- a/nova/api/openstack/views/addresses.py +++ b/nova/api/openstack/views/addresses.py @@ -52,7 +52,7 @@ class ViewBuilderV11(ViewBuilder): for interface in interfaces: try: network_label = self._extract_network_label(interface) - except TypeError as exc: + except TypeError: continue if network_label not in networks: -- cgit From 295bcc8ef70d767bf1539defe1a79a67bdf555ff Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Tue, 23 Aug 2011 13:44:39 -0400 Subject: updating tests --- nova/tests/api/openstack/test_servers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index cec6eecc0..e5c1f2c34 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -785,7 +785,7 @@ class ServersTest(test.TestCase): 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/servers/1') + 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) -- cgit