Notifier: Catch NotFound error from nova

If neutron sends a single event to nova and the server_uuid isn't found
in nova. The python-novaclient will raise a 404 error. This patch ensures
we explicitly catch that exception and use LOG.warning instead of LOG.exception
as this is not an error and can happen when deleting an instance if neutron
detects that the port_status goes down before the port is deleted because
nova first unplugs the vif and then deletes it from neutron.

Change-Id: I909025503fc88a92201d5247ae5223e4516e8707
Closes-bug: #1309187
This commit is contained in:
Aaron Rosen 2014-04-17 13:42:39 -07:00
parent 9a1af60ae0
commit c049583e80
2 changed files with 12 additions and 0 deletions

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from novaclient import exceptions as nova_exceptions
import novaclient.v1_1.client as nclient import novaclient.v1_1.client as nclient
from novaclient.v1_1.contrib import server_external_events from novaclient.v1_1.contrib import server_external_events
from oslo.config import cfg from oslo.config import cfg
@ -186,6 +187,9 @@ class Notifier(object):
try: try:
response = self.nclient.server_external_events.create( response = self.nclient.server_external_events.create(
batched_events) batched_events)
except nova_exceptions.NotFound:
LOG.warning(_("Nova returned NotFound for event: %s"),
batched_events)
except Exception: except Exception:
LOG.exception(_("Failed to notify nova on events: %s"), LOG.exception(_("Failed to notify nova on events: %s"),
batched_events) batched_events)

View File

@ -15,6 +15,7 @@
import mock import mock
from novaclient import exceptions as nova_exceptions
from sqlalchemy.orm import attributes as sql_attr from sqlalchemy.orm import attributes as sql_attr
from oslo.config import cfg from oslo.config import cfg
@ -219,6 +220,13 @@ class TestNovaNotify(base.BaseTestCase):
nclient_create.return_value = 'i am a string!' nclient_create.return_value = 'i am a string!'
self.nova_notifier.send_events() self.nova_notifier.send_events()
def test_nova_send_event_rasies_404(self):
with mock.patch.object(
self.nova_notifier.nclient.server_external_events,
'create') as nclient_create:
nclient_create.side_effect = nova_exceptions.NotFound
self.nova_notifier.send_events()
def test_nova_send_events_raises(self): def test_nova_send_events_raises(self):
with mock.patch.object( with mock.patch.object(
self.nova_notifier.nclient.server_external_events, self.nova_notifier.nclient.server_external_events,