Merge "Don't delete neutron port when attach failed" into stable/ocata

This commit is contained in:
Zuul 2018-10-05 12:50:20 +00:00 committed by Gerrit Code Review
commit 8c663dbd25
4 changed files with 31 additions and 20 deletions

View File

@ -11,20 +11,7 @@
"fault":null, "fault":null,
"host":"compute", "host":"compute",
"host_name":"some-server", "host_name":"some-server",
"ip_addresses": [{ "ip_addresses": [],
"nova_object.name": "IpPayload",
"nova_object.namespace": "nova",
"nova_object.version": "1.0",
"nova_object.data": {
"mac": "fa:16:3e:4c:2c:30",
"address": "192.168.1.3",
"port_uuid": "ce531f90-199f-48c0-816c-13e38010b442",
"meta": {},
"version": 4,
"label": "private-network",
"device_name": "tapce531f90-19"
}
}],
"kernel_id":"", "kernel_id":"",
"launched_at":"2012-10-29T13:42:11Z", "launched_at":"2012-10-29T13:42:11Z",
"image_uuid": "155d900f-4e14-4e4c-a73d-069cbf4541e6", "image_uuid": "155d900f-4e14-4e4c-a73d-069cbf4541e6",

View File

@ -53,6 +53,7 @@ def update_instance_cache_with_nw_info(impl, context, instance,
ic = objects.InstanceInfoCache.new(context, instance.uuid) ic = objects.InstanceInfoCache.new(context, instance.uuid)
ic.network_info = nw_info ic.network_info = nw_info
ic.save(update_cells=update_cells) ic.save(update_cells=update_cells)
instance.info_cache = ic
except Exception: except Exception:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.exception(_LE('Failed storing info cache'), instance=instance) LOG.exception(_LE('Failed storing info cache'), instance=instance)

View File

@ -15,6 +15,7 @@
"""Tests for network API.""" """Tests for network API."""
import copy
import itertools import itertools
import uuid import uuid
@ -559,7 +560,7 @@ class ApiTestCase(test.TestCase):
@mock.patch('nova.network.api.API') @mock.patch('nova.network.api.API')
@mock.patch('nova.db.instance_info_cache_update', return_value=fake_info_cache) @mock.patch('nova.db.instance_info_cache_update')
class TestUpdateInstanceCache(test.NoDBTestCase): class TestUpdateInstanceCache(test.NoDBTestCase):
def setUp(self): def setUp(self):
super(TestUpdateInstanceCache, self).setUp() super(TestUpdateInstanceCache, self).setUp()
@ -572,13 +573,16 @@ class TestUpdateInstanceCache(test.NoDBTestCase):
def test_update_nw_info_none(self, db_mock, api_mock): def test_update_nw_info_none(self, db_mock, api_mock):
api_mock._get_instance_nw_info.return_value = self.nw_info api_mock._get_instance_nw_info.return_value = self.nw_info
info_cache = copy.deepcopy(fake_info_cache)
info_cache.update({'network_info': self.nw_json})
db_mock.return_value = info_cache
base_api.update_instance_cache_with_nw_info(api_mock, self.context, base_api.update_instance_cache_with_nw_info(api_mock, self.context,
self.instance, None) self.instance, None)
api_mock._get_instance_nw_info.assert_called_once_with(self.context, api_mock._get_instance_nw_info.assert_called_once_with(self.context,
self.instance) self.instance)
db_mock.assert_called_once_with(self.context, self.instance.uuid, db_mock.assert_called_once_with(self.context, self.instance.uuid,
{'network_info': self.nw_json}) {'network_info': self.nw_json})
self.assertEqual(self.nw_info, self.instance.info_cache.network_info)
def test_update_nw_info_none_instance_deleted(self, db_mock, api_mock): def test_update_nw_info_none_instance_deleted(self, db_mock, api_mock):
instance = objects.Instance(uuid=FAKE_UUID, deleted=True) instance = objects.Instance(uuid=FAKE_UUID, deleted=True)
@ -587,23 +591,29 @@ class TestUpdateInstanceCache(test.NoDBTestCase):
self.assertFalse(api_mock.called) self.assertFalse(api_mock.called)
def test_update_nw_info_one_network(self, db_mock, api_mock): def test_update_nw_info_one_network(self, db_mock, api_mock):
api_mock._get_instance_nw_info.return_value = self.nw_info info_cache = copy.deepcopy(fake_info_cache)
info_cache.update({'network_info': self.nw_json})
db_mock.return_value = info_cache
base_api.update_instance_cache_with_nw_info(api_mock, self.context, base_api.update_instance_cache_with_nw_info(api_mock, self.context,
self.instance, self.nw_info) self.instance, self.nw_info)
self.assertFalse(api_mock._get_instance_nw_info.called) self.assertFalse(api_mock._get_instance_nw_info.called)
db_mock.assert_called_once_with(self.context, self.instance.uuid, db_mock.assert_called_once_with(self.context, self.instance.uuid,
{'network_info': self.nw_json}) {'network_info': self.nw_json})
self.assertEqual(self.nw_info, self.instance.info_cache.network_info)
def test_update_nw_info_empty_list(self, db_mock, api_mock): def test_update_nw_info_empty_list(self, db_mock, api_mock):
api_mock._get_instance_nw_info.return_value = self.nw_info new_nw_info = network_model.NetworkInfo([])
db_mock.return_value = fake_info_cache
base_api.update_instance_cache_with_nw_info(api_mock, self.context, base_api.update_instance_cache_with_nw_info(api_mock, self.context,
self.instance, self.instance, new_nw_info)
network_model.NetworkInfo([]))
self.assertFalse(api_mock._get_instance_nw_info.called) self.assertFalse(api_mock._get_instance_nw_info.called)
db_mock.assert_called_once_with(self.context, self.instance.uuid, db_mock.assert_called_once_with(self.context, self.instance.uuid,
{'network_info': '[]'}) {'network_info': '[]'})
self.assertEqual(new_nw_info, self.instance.info_cache.network_info)
def test_decorator_return_object(self, db_mock, api_mock): def test_decorator_return_object(self, db_mock, api_mock):
db_mock.return_value = fake_info_cache
@base_api.refresh_cache @base_api.refresh_cache
def func(self, context, instance): def func(self, context, instance):
return network_model.NetworkInfo([]) return network_model.NetworkInfo([])
@ -613,6 +623,8 @@ class TestUpdateInstanceCache(test.NoDBTestCase):
{'network_info': '[]'}) {'network_info': '[]'})
def test_decorator_return_none(self, db_mock, api_mock): def test_decorator_return_none(self, db_mock, api_mock):
db_mock.return_value = fake_info_cache
@base_api.refresh_cache @base_api.refresh_cache
def func(self, context, instance): def func(self, context, instance):
pass pass

View File

@ -0,0 +1,11 @@
---
other:
- |
``instance.shutdown.end`` versioned notification will
have an empty ``ip_addresses`` field since the network
resources associated with the instance are deallocated
before this notification is sent, which is actually
more accurate. Consumers should rely on the
instance.shutdown.start notification if they need the
network information for the instance when it is being
deleted.