Merge "Check for existing interfaces before adding implicit one"

This commit is contained in:
Zuul 2017-11-13 23:19:58 +00:00 committed by Gerrit Code Review
commit 1532d99b3d
2 changed files with 51 additions and 7 deletions

View File

@ -372,13 +372,16 @@ class ServerNetworkMixin(object):
new_nets = new_nets or []
old_nets = old_nets or []
remove_ports = self._calculate_remove_ports(old_nets, new_nets, ifaces)
add_nets = self._calculate_add_nets(new_nets, security_groups)
remove_ports, not_updated_nets = self._calculate_remove_ports(
old_nets, new_nets, ifaces)
add_nets = self._calculate_add_nets(new_nets, not_updated_nets,
security_groups)
return remove_ports, add_nets
def _calculate_remove_ports(self, old_nets, new_nets, ifaces):
remove_ports = []
not_updated_nets = []
# if old nets is empty, it means that the server got first
# free port. so we should detach this interface.
if not old_nets:
@ -424,14 +427,16 @@ class ServerNetworkMixin(object):
if net.get(self.NETWORK_FLOATING_IP):
self._floating_ip_disassociate(
net.get(self.NETWORK_FLOATING_IP))
return remove_ports
return remove_ports, not_updated_nets
def _calculate_add_nets(self, new_nets, security_groups):
def _calculate_add_nets(self, new_nets, not_updated_nets,
security_groups):
add_nets = []
# if new_nets is empty, we should attach first free port,
# according to similar behavior during instance creation
if not new_nets:
# if new_nets is empty (including the non_updated_nets), we should
# attach first free port, similar to the behavior for instance
# creation
if not new_nets and not not_updated_nets:
handler_kwargs = {'port_id': None, 'net_id': None, 'fip': None}
if security_groups:
sec_uuids = self.client_plugin(

View File

@ -3955,6 +3955,45 @@ class ServersTest(common.HeatTestCase):
self.assertEqual(3, mock_detach_check.call_count)
self.assertEqual(1, mock_attach_check.call_count)
def test_server_update_remove_network_non_empty(self):
return_server = self.fc.servers.list()[1]
return_server.id = '5678'
old_networks = [
{'port': '95e25541-d26a-478d-8f36-ae1c8f6b74dc'},
{'port': '4121f61a-1b2e-4ab0-901e-eade9b1cb09d'}]
new_networks = [
{'port': '95e25541-d26a-478d-8f36-ae1c8f6b74dc'}]
server = self._create_test_server(return_server, 'networks_update',
networks=old_networks)
update_props = self.server_props.copy()
update_props['networks'] = new_networks
update_template = server.t.freeze(properties=update_props)
self.patchobject(self.fc.servers, 'get', return_value=return_server)
poor_interfaces = [
self.create_fake_iface('95e25541-d26a-478d-8f36-ae1c8f6b74dc',
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
'11.12.13.14'),
self.create_fake_iface('4121f61a-1b2e-4ab0-901e-eade9b1cb09d',
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
'21.22.23.24'),
]
self.patchobject(return_server, 'interface_list',
return_value=poor_interfaces)
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)
scheduler.TaskRunner(server.update, update_template)()
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
self.assertEqual(1, mock_detach.call_count)
self.assertEqual(1, mock_detach_check.call_count)
self.assertEqual(0, mock_attach.call_count)
def test_server_properties_validation_create_and_update(self):
return_server = self.fc.servers.list()[1]