Merge "Don't delete neutron port when attach failed"
This commit is contained in:
commit
de5c9e076d
@ -11,21 +11,8 @@
|
|||||||
"fault":null,
|
"fault":null,
|
||||||
"host":"compute",
|
"host":"compute",
|
||||||
"host_name":"some-server",
|
"host_name":"some-server",
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
"key_name": "my-key",
|
"key_name": "my-key",
|
||||||
|
"ip_addresses": [],
|
||||||
"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",
|
||||||
|
@ -48,6 +48,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)
|
||||||
|
@ -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,32 +573,41 @@ 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_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([])
|
||||||
@ -607,6 +617,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
|
||||||
|
11
releasenotes/notes/bug-1645175-b1ef3ad9a3e44ed6.yaml
Normal file
11
releasenotes/notes/bug-1645175-b1ef3ad9a3e44ed6.yaml
Normal 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.
|
Loading…
x
Reference in New Issue
Block a user