Fix networks update from [] to None

Correct the logic of networks updating, to avoid
attach two interfaces to a server if update 'networks'
from [] to None. Also if user update 'networks' between
[] and None, we don't have to detach the old one and
attach a new one.

Closes-Bug: #1706830
Change-Id: I45679e83aacd07950a8fd980ed1f34e68a398356
This commit is contained in:
huangtianhua 2017-07-27 15:05:16 +08:00
parent 66ee6914e7
commit e1973fd956
2 changed files with 40 additions and 6 deletions
heat
engine/resources/openstack/nova
tests/openstack/nova

@ -368,13 +368,18 @@ class ServerNetworkMixin(object):
remove_ports = []
add_nets = []
attach_first_free_port = False
# if update networks between None and empty, no need to
# detach and attach, the server got first free port already.
if not new_nets and not old_nets:
return remove_ports, add_nets
if not new_nets:
new_nets = []
attach_first_free_port = True
# if old nets is None, it means that the server got first
# if there is no old_nets, it means that the server got first
# free port. so we should detach this interface.
if old_nets is None:
if not old_nets:
for iface in ifaces:
remove_ports.append(iface.port_id)

@ -3586,7 +3586,6 @@ class ServersTest(common.HeatTestCase):
return_server = self.fc.servers.list()[3]
return_server.id = '9102'
server = self._create_test_server(return_server, 'networks_update')
new_networks = [{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
'fixed_ip': '1.2.3.4',
'port': '2a60cbaa-3d33-4af6-a9ce-83594ac546fc'}]
@ -3615,6 +3614,37 @@ class ServersTest(common.HeatTestCase):
self.assertEqual(1, mock_detach_check.call_count)
self.assertEqual(1, mock_attach_check.call_count)
def test_server_update_empty_networks_to_None(self):
return_server = self.fc.servers.list()[3]
return_server.id = '9102'
server = self._create_test_server(return_server, 'networks_update',
networks=[])
update_props = copy.deepcopy(self.server_props)
update_props.pop('networks')
update_template = server.t.freeze(properties=update_props)
self.patchobject(self.fc.servers, 'get', return_value=return_server)
iface = self.create_fake_iface('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
'450abbc9-9b6d-4d6f-8c3a-c47ac34100ef',
'1.2.3.4')
self.patchobject(return_server, 'interface_list', return_value=[iface])
mock_detach = self.patchobject(return_server, 'interface_detach')
mock_attach = self.patchobject(return_server, 'interface_attach')
mock_detach_check = self.patchobject(nova.NovaClientPlugin,
'check_interface_detach',
return_value=True)
mock_attach_check = self.patchobject(nova.NovaClientPlugin,
'check_interface_attach',
return_value=True)
scheduler.TaskRunner(server.update, update_template)()
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
# test we detach the old interface and attach a new one
self.assertEqual(0, mock_detach.call_count)
self.assertEqual(0, mock_attach.call_count)
self.assertEqual(0, mock_detach_check.call_count)
self.assertEqual(0, mock_attach_check.call_count)
def _test_server_update_to_auto(self, available_multi_nets=None):
multi_nets = available_multi_nets or []
return_server = self.fc.servers.list()[1]
@ -3806,14 +3836,14 @@ class ServersTest(common.HeatTestCase):
mock_attach_check = self.patchobject(nova.NovaClientPlugin,
'check_interface_attach',
return_value=True)
scheduler.TaskRunner(server.update, update_template)()
scheduler.TaskRunner(server.update, update_template, before=server.t)()
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
self.assertEqual(3, mock_detach.call_count)
self.assertEqual(1, mock_attach.call_count)
self.assertEqual(3, mock_detach_check.call_count)
self.assertEqual(1, mock_attach_check.call_count)
def test_server_update_networks_with_empty_list(self):
def test_server_update_old_networks_to_empty_list(self):
return_server = self.fc.servers.list()[1]
return_server.id = '5678'
old_networks = [
@ -3851,7 +3881,6 @@ class ServersTest(common.HeatTestCase):
mock_attach_check = self.patchobject(nova.NovaClientPlugin,
'check_interface_attach',
return_value=True)
scheduler.TaskRunner(server.update, update_template)()
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
self.assertEqual(3, mock_detach.call_count)