From b20188d2652e4907dcfc173f4d5d1a8d557227e1 Mon Sep 17 00:00:00 2001 From: Hong Hui Xiao Date: Tue, 14 Jun 2016 15:35:40 +0000 Subject: [PATCH] Only update SegmentHostMapping for the given host Now, when an agent removes a physical network from its configuration, not only the segments with that physical network will be unbinded from the host of upated agent. All the segments with that physical network will be unbinded from all hosts. This is incorrect, the segments should only be unbinded from the host of updated agent. Change-Id: Iccca843d1682ac54ec87c3b003a33a0fc5c62205 Closes-bug: #1592463 --- neutron/services/segments/db.py | 2 +- neutron/tests/unit/extensions/test_segment.py | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/neutron/services/segments/db.py b/neutron/services/segments/db.py index 2ac39e1eb7d..c856819e10c 100644 --- a/neutron/services/segments/db.py +++ b/neutron/services/segments/db.py @@ -173,7 +173,7 @@ def update_segment_host_mapping(context, host, current_segment_ids): host=host)) stale_segment_ids = previous_segment_ids - current_segment_ids if stale_segment_ids: - context.session.query(SegmentHostMapping).filter( + segments_host_query.filter( SegmentHostMapping.segment_id.in_( stale_segment_ids)).delete(synchronize_session=False) diff --git a/neutron/tests/unit/extensions/test_segment.py b/neutron/tests/unit/extensions/test_segment.py index 113e673d7b9..16d4ec8a50f 100644 --- a/neutron/tests/unit/extensions/test_segment.py +++ b/neutron/tests/unit/extensions/test_segment.py @@ -392,6 +392,43 @@ class TestMl2HostSegmentMappingOVS(HostSegmentMappingTestCase): segments_host_db[segment['id']]['segment_id']) self.assertEqual(host2, segments_host_db[segment['id']]['host']) + def test_update_agent_only_change_agent_host_mapping(self): + host1 = 'host1' + host2 = 'host2' + physical_network = 'phys_net1' + with self.network() as network: + network = network['network'] + segment1 = self._test_create_segment( + network_id=network['id'], + physical_network=physical_network, + segmentation_id=200, + network_type=p_constants.TYPE_VLAN)['segment'] + self._register_agent(host1, mappings={physical_network: 'br-eth-1'}, + plugin=self.plugin) + self._register_agent(host2, mappings={physical_network: 'br-eth-1'}, + plugin=self.plugin) + + # Update agent at host2 should only change mapping with host2. + other_phys_net = 'phys_net2' + segment2 = self._test_create_segment( + network_id=network['id'], + physical_network=other_phys_net, + segmentation_id=201, + network_type=p_constants.TYPE_VLAN)['segment'] + self._register_agent(host2, mappings={other_phys_net: 'br-eth-2'}, + plugin=self.plugin) + # We should have segment1 map to host1 and segment2 map to host2 now + segments_host_db1 = self._get_segments_for_host(host1) + self.assertEqual(1, len(segments_host_db1)) + self.assertEqual(segment1['id'], + segments_host_db1[segment1['id']]['segment_id']) + self.assertEqual(host1, segments_host_db1[segment1['id']]['host']) + segments_host_db2 = self._get_segments_for_host(host2) + self.assertEqual(1, len(segments_host_db2)) + self.assertEqual(segment2['id'], + segments_host_db2[segment2['id']]['segment_id']) + self.assertEqual(host2, segments_host_db2[segment2['id']]['host']) + def test_new_segment_after_host_reg(self): host1 = 'host1' physical_network = 'phys_net1'