From: shihanzhang Date: Tue, 26 May 2015 01:29:58 +0000 (+0800) Subject: Fix ovs agent restore local_vlan_map failed X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=c9fcbc2e7758acf08867db9a7bc89685cd916bbb;p=openstack-build%2Fneutron-build.git Fix ovs agent restore local_vlan_map failed when ovs agent restart, it will restore the local_vlan_map, but in some condition, if a device does not be set tag in ovsdb, the function 'db_get_val("Port", port.port_name, "tag")' will return a empty list, it does not need 'provision_local_vlan' for this device. Change-Id: I70ed30e6ea5d13e6f14bb41c957320cc21dbca1b Closes-bug: #1458709 --- diff --git a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py index cb3d44827..003cbdf06 100644 --- a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py @@ -300,6 +300,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, local_vlan_map = self.int_br.db_get_val("Port", port.port_name, "other_config") local_vlan = self.int_br.db_get_val("Port", port.port_name, "tag") + if not local_vlan: + continue net_uuid = local_vlan_map.get('net_uuid') if (net_uuid and net_uuid not in self.local_vlan_map and local_vlan != DEAD_VLAN_TAG): diff --git a/neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py b/neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py index fb068790c..af4c5496b 100644 --- a/neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py @@ -159,6 +159,30 @@ class TestOvsNeutronAgent(object): int_br.set_db_attribute.assert_called_once_with( "Port", mock.ANY, "other_config", vlan_mapping) + def _test_restore_local_vlan_maps(self, tag): + port = mock.Mock() + port.port_name = 'fake_port' + local_vlan_map = {'net_uuid': 'fake_network_id', + 'network_type': 'vlan', + 'physical_network': 'fake_network', + 'segmentation_id': 1} + with mock.patch.object(self.agent, 'int_br') as int_br, \ + mock.patch.object(self.agent, 'provision_local_vlan') as \ + provision_local_vlan: + int_br.get_vif_ports.return_value = [port] + int_br.db_get_val.side_effect = [local_vlan_map, tag] + self.agent._restore_local_vlan_map() + if tag: + self.assertTrue(provision_local_vlan.called) + else: + self.assertFalse(provision_local_vlan.called) + + def test_restore_local_vlan_map_with_device_has_tag(self): + self._test_restore_local_vlan_maps(2) + + def test_restore_local_vlan_map_with_device_no_tag(self): + self._test_restore_local_vlan_maps([]) + def test_check_agent_configurations_for_dvr_raises(self): self.agent.enable_distributed_routing = True self.agent.enable_tunneling = True