From 25c79b0ee78639a8abd9ab81c016ed26ba70a5d7 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Thu, 17 Apr 2014 14:48:55 -0700 Subject: [PATCH] NSX: sync thread catches wrong exceptions on not found Previously the sync code expected exc.NoResultFound to be raised if a port/router/network was not found in the database. This is actually not the correct exception raised. This error will only occur if an element is deleted from the db right when the sync thead is run for a specific element. Change-Id: I3a5c8316ade49004fb9fa0b454435205c543f6ee Closes-bug: 1309208 --- neutron/plugins/vmware/common/sync.py | 9 ++--- neutron/tests/unit/vmware/test_nsx_sync.py | 47 ++++++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/neutron/plugins/vmware/common/sync.py b/neutron/plugins/vmware/common/sync.py index d032f43fe..76a335430 100644 --- a/neutron/plugins/vmware/common/sync.py +++ b/neutron/plugins/vmware/common/sync.py @@ -15,14 +15,13 @@ import random -from sqlalchemy.orm import exc - from neutron.common import constants from neutron.common import exceptions from neutron import context from neutron.db import external_net_db from neutron.db import l3_db from neutron.db import models_v2 +from neutron.extensions import l3 from neutron.openstack.common import jsonutils from neutron.openstack.common import log from neutron.openstack.common import loopingcall @@ -285,7 +284,7 @@ class NsxSynchronizer(): try: network = self._plugin._get_network(context, neutron_network_data['id']) - except exc.NoResultFound: + except exceptions.NetworkNotFound: pass else: network.status = status @@ -367,7 +366,7 @@ class NsxSynchronizer(): try: router = self._plugin._get_router(context, neutron_router_data['id']) - except exc.NoResultFound: + except l3.RouterNotFound: pass else: router.status = status @@ -462,7 +461,7 @@ class NsxSynchronizer(): try: port = self._plugin._get_port(context, neutron_port_data['id']) - except exc.NoResultFound: + except exceptions.PortNotFound: pass else: port.status = status diff --git a/neutron/tests/unit/vmware/test_nsx_sync.py b/neutron/tests/unit/vmware/test_nsx_sync.py index 579317053..a3abb772d 100644 --- a/neutron/tests/unit/vmware/test_nsx_sync.py +++ b/neutron/tests/unit/vmware/test_nsx_sync.py @@ -23,7 +23,9 @@ from oslo.config import cfg from neutron.api.v2 import attributes as attr from neutron.common import config from neutron.common import constants +from neutron.common import exceptions as n_exc from neutron import context +from neutron.extensions import l3 from neutron.openstack.common import jsonutils as json from neutron.openstack.common import log from neutron.plugins.vmware.api_client import client @@ -555,6 +557,21 @@ class SyncTestCase(base.BaseTestCase): exp_status = constants.NET_STATUS_ACTIVE self.assertEqual(exp_status, q_net['status']) + def test_synchronize_network_not_found_in_db_no_raise(self): + ctx = context.get_admin_context() + with self._populate_data(ctx): + # Put a network down to verify synchronization + ls_uuid = self.fc._fake_lswitch_dict.keys()[0] + q_net_id = self._get_tag_dict( + self.fc._fake_lswitch_dict[ls_uuid]['tags'])['quantum_net_id'] + self.fc._fake_lswitch_dict[ls_uuid]['status'] = 'false' + q_net_data = self._plugin._get_network(ctx, q_net_id) + with mock.patch.object(self._plugin, + '_get_network') as _get_network: + _get_network.side_effect = n_exc.NetworkNotFound( + net_id=q_net_data['id']) + self._plugin._synchronizer.synchronize_network(ctx, q_net_data) + def test_synchronize_network_on_get(self): cfg.CONF.set_override('always_read_status', True, 'NSX_SYNC') ctx = context.get_admin_context() @@ -567,6 +584,21 @@ class SyncTestCase(base.BaseTestCase): q_net_data = self._plugin.get_network(ctx, q_net_id) self.assertEqual(constants.NET_STATUS_DOWN, q_net_data['status']) + def test_synchronize_port_not_found_in_db_no_raise(self): + ctx = context.get_admin_context() + with self._populate_data(ctx): + # Put a port down to verify synchronization + lp_uuid = self.fc._fake_lswitch_lport_dict.keys()[0] + lport = self.fc._fake_lswitch_lport_dict[lp_uuid] + q_port_id = self._get_tag_dict(lport['tags'])['q_port_id'] + lport['status'] = 'true' + q_port_data = self._plugin._get_port(ctx, q_port_id) + with mock.patch.object(self._plugin, + '_get_port') as _get_port: + _get_port.side_effect = n_exc.PortNotFound( + port_id=q_port_data['id']) + self._plugin._synchronizer.synchronize_port(ctx, q_port_data) + def test_synchronize_port(self): ctx = context.get_admin_context() with self._populate_data(ctx): @@ -599,6 +631,21 @@ class SyncTestCase(base.BaseTestCase): self.assertEqual(constants.PORT_STATUS_DOWN, q_port_data['status']) + def test_synchronize_routernot_found_in_db_no_raise(self): + ctx = context.get_admin_context() + with self._populate_data(ctx): + # Put a router down to verify synchronization + lr_uuid = self.fc._fake_lrouter_dict.keys()[0] + q_rtr_id = self._get_tag_dict( + self.fc._fake_lrouter_dict[lr_uuid]['tags'])['q_router_id'] + self.fc._fake_lrouter_dict[lr_uuid]['status'] = 'false' + q_rtr_data = self._plugin._get_router(ctx, q_rtr_id) + with mock.patch.object(self._plugin, + '_get_router') as _get_router: + _get_router.side_effect = l3.RouterNotFound( + router_id=q_rtr_data['id']) + self._plugin._synchronizer.synchronize_router(ctx, q_rtr_data) + def test_synchronize_router(self): ctx = context.get_admin_context() with self._populate_data(ctx): -- 2.45.2