Skip to content

Commit

Permalink
Skip info cache update in case instance is deleted
Browse files Browse the repository at this point in the history
The network api is sometimes called for a deleted instance causing
info cache update to fail. An example of this is the compute manager
periodic task cleanup_running_deleted_instances() that tries to
shutdown deleted instances still running on a host.

Add a check in network_api.update_instance_cache_with_nw_info() that
will skip info cache update if the instance is deleted.

Change-Id: Ibcf2db92275c9860409793d469ed688e7024120b
Closes-Bug: #1282858
  • Loading branch information
hanlind authored and Eric Windisch committed Mar 11, 2014
1 parent 99188bc commit 41168ed
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 5 deletions.
5 changes: 5 additions & 0 deletions nova/network/api.py
Expand Up @@ -20,6 +20,7 @@
import inspect

from nova.compute import flavors
from nova.compute import vm_states
from nova.db import base
from nova import exception
from nova.network import floating_ips
Expand Down Expand Up @@ -66,6 +67,10 @@ def wrapper(self, context, *args, **kwargs):

def update_instance_cache_with_nw_info(api, context, instance, nw_info=None,
update_cells=True):
if instance['vm_state'] == vm_states.DELETED:
LOG.debug(_('Skipping info cache update for deleted instance.'),
instance=instance)
return
try:
LOG.debug(_('Updating cache with info: %s'), nw_info)
if not isinstance(nw_info, network_model.NetworkInfo):
Expand Down
Expand Up @@ -24,6 +24,7 @@
from nova.api.openstack.compute.contrib import security_groups
from nova.api.openstack import xmlutil
from nova import compute
from nova.compute import vm_states
from nova import context
import nova.db
from nova import exception
Expand Down Expand Up @@ -173,7 +174,8 @@ def test_delete_security_group_in_use(self):
'info_cache': {'network_info': []},
'security_groups': [],
'uuid': str(uuid.uuid4()),
'display_name': 'test_instance'}
'display_name': 'test_instance',
'vm_state': vm_states.ACTIVE}
neutron = neutron_api.API()
neutron.allocate_for_instance(context.get_admin_context(),
fake_instance,
Expand Down
17 changes: 15 additions & 2 deletions nova/tests/network/test_api.py
Expand Up @@ -18,9 +18,11 @@
import itertools
import random

import mock
import mox

from nova.compute import flavors
from nova.compute import vm_states
from nova import context
from nova import db
from nova import exception
Expand All @@ -29,6 +31,7 @@
from nova.network import floating_ips
from nova.network import model as network_model
from nova.network import rpcapi as network_rpcapi
from nova.objects import instance_info_cache as info_cache_obj
from nova import policy
from nova import test
from nova import utils
Expand Down Expand Up @@ -86,7 +89,8 @@ def test_allocate_for_instance_handles_macs_passed(self):
flavor['rxtx_factor'] = 0
sys_meta = flavors.save_flavor_info({}, flavor)
instance = dict(id='id', uuid='uuid', project_id='project_id',
host='host', system_metadata=utils.dict_to_metadata(sys_meta))
host='host', system_metadata=utils.dict_to_metadata(sys_meta),
vm_state=vm_states.ACTIVE)
self.network_api.allocate_for_instance(
self.context, instance, 'vpn', 'requested_networks', macs=macs)

Expand Down Expand Up @@ -291,7 +295,7 @@ class TestUpdateInstanceCache(test.TestCase):
def setUp(self):
super(TestUpdateInstanceCache, self).setUp()
self.context = context.get_admin_context()
self.instance = {'uuid': FAKE_UUID}
self.instance = {'uuid': FAKE_UUID, 'vm_state': vm_states.ACTIVE}
self.impl = self.mox.CreateMock(api.API)
vifs = [network_model.VIF(id='super_vif')]
self.nw_info = network_model.NetworkInfo(vifs)
Expand Down Expand Up @@ -324,6 +328,15 @@ def test_update_nw_info_empty_list(self):
self.instance,
network_model.NetworkInfo([]))

def test_update_nw_info_deleted_instance(self):
with mock.patch.object(info_cache_obj.InstanceInfoCache,
'save') as ic_save:
api.update_instance_cache_with_nw_info(
self.impl, self.context,
dict(self.instance, vm_state=vm_states.DELETED),
network_model.NetworkInfo([]))
self.assertFalse(ic_save.called)

def test_decorator_return_object(self):
@api.refresh_cache
def func(self, context, instance):
Expand Down
7 changes: 5 additions & 2 deletions nova/tests/network/test_neutronv2.py
Expand Up @@ -23,6 +23,7 @@
import six

from nova.compute import flavors
from nova.compute import vm_states
from nova.conductor import api as conductor_api
from nova import context
from nova import exception
Expand Down Expand Up @@ -158,12 +159,14 @@ def setUp(self):
'display_name': 'test_instance',
'availability_zone': 'nova',
'host': 'some_host',
'security_groups': []}
'security_groups': [],
'vm_state': vm_states.ACTIVE}
self.instance2 = {'project_id': '9d049e4b60b64716978ab415e6fbd5c0',
'uuid': str(uuid.uuid4()),
'display_name': 'test_instance2',
'availability_zone': 'nova',
'security_groups': []}
'security_groups': [],
'vm_state': vm_states.ACTIVE}
self.nets1 = [{'id': 'my_netid1',
'name': 'my_netname1',
'tenant_id': 'my_tenantid'}]
Expand Down

0 comments on commit 41168ed

Please sign in to comment.