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:
parent
66ee6914e7
commit
e1973fd956
heat
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user