Merge "[OVS] Handle added/removed ports in the same polling iteration" into stable/train
This commit is contained in:
commit
8994186c65
|
@ -79,6 +79,11 @@ from neutron.plugins.ml2.drivers.openvswitch.agent \
|
||||||
import ovs_dvr_neutron_agent
|
import ovs_dvr_neutron_agent
|
||||||
from neutron.plugins.ml2.drivers.openvswitch.agent import vlanmanager
|
from neutron.plugins.ml2.drivers.openvswitch.agent import vlanmanager
|
||||||
|
|
||||||
|
if six.PY2:
|
||||||
|
abc_dict = dict
|
||||||
|
else:
|
||||||
|
abc_dict = collections.UserDict
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
cfg.CONF.import_group('AGENT', 'neutron.plugins.ml2.drivers.openvswitch.'
|
cfg.CONF.import_group('AGENT', 'neutron.plugins.ml2.drivers.openvswitch.'
|
||||||
|
@ -97,6 +102,17 @@ class OVSPluginApi(agent_rpc.CacheBackedPluginApi):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class PortInfo(abc_dict):
|
||||||
|
def __init__(self, current=None, added=None, removed=None, updated=None,
|
||||||
|
re_added=None):
|
||||||
|
_dict = {'current': current or set(),
|
||||||
|
'added': added or set(),
|
||||||
|
'removed': removed or set(),
|
||||||
|
'updated': updated or set(),
|
||||||
|
're_added': re_added or set()}
|
||||||
|
super(PortInfo, self).__init__(_dict)
|
||||||
|
|
||||||
|
|
||||||
def has_zero_prefixlen_address(ip_addresses):
|
def has_zero_prefixlen_address(ip_addresses):
|
||||||
return any(netaddr.IPNetwork(ip).prefixlen == 0 for ip in ip_addresses)
|
return any(netaddr.IPNetwork(ip).prefixlen == 0 for ip in ip_addresses)
|
||||||
|
|
||||||
|
@ -1560,9 +1576,7 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
|
|
||||||
def _get_port_info(self, registered_ports, cur_ports,
|
def _get_port_info(self, registered_ports, cur_ports,
|
||||||
readd_registered_ports):
|
readd_registered_ports):
|
||||||
port_info = {'current': cur_ports,
|
port_info = PortInfo(current=cur_ports)
|
||||||
'added': set(),
|
|
||||||
'removed': set()}
|
|
||||||
# FIXME(salv-orlando): It's not really necessary to return early
|
# FIXME(salv-orlando): It's not really necessary to return early
|
||||||
# if nothing has changed.
|
# if nothing has changed.
|
||||||
if not readd_registered_ports and cur_ports == registered_ports:
|
if not readd_registered_ports and cur_ports == registered_ports:
|
||||||
|
@ -1596,15 +1610,8 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
def process_ports_events(self, events, registered_ports, ancillary_ports,
|
def process_ports_events(self, events, registered_ports, ancillary_ports,
|
||||||
old_ports_not_ready, failed_devices,
|
old_ports_not_ready, failed_devices,
|
||||||
failed_ancillary_devices, updated_ports=None):
|
failed_ancillary_devices, updated_ports=None):
|
||||||
port_info = {}
|
port_info = PortInfo(current=registered_ports)
|
||||||
port_info['added'] = set()
|
ancillary_port_info = PortInfo(current=ancillary_ports)
|
||||||
port_info['removed'] = set()
|
|
||||||
port_info['current'] = registered_ports
|
|
||||||
|
|
||||||
ancillary_port_info = {}
|
|
||||||
ancillary_port_info['added'] = set()
|
|
||||||
ancillary_port_info['removed'] = set()
|
|
||||||
ancillary_port_info['current'] = ancillary_ports
|
|
||||||
|
|
||||||
ports_not_ready_yet = set()
|
ports_not_ready_yet = set()
|
||||||
# if a port was added and then removed or viceversa since the agent
|
# if a port was added and then removed or viceversa since the agent
|
||||||
|
@ -1612,9 +1619,12 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
# to determine if the port was added or deleted
|
# to determine if the port was added or deleted
|
||||||
added_ports = {p['name'] for p in events['added']}
|
added_ports = {p['name'] for p in events['added']}
|
||||||
removed_ports = {p['name'] for p in events['removed']}
|
removed_ports = {p['name'] for p in events['removed']}
|
||||||
ports_removed_and_added = added_ports & removed_ports
|
|
||||||
for p in ports_removed_and_added:
|
ports_re_added = added_ports & removed_ports
|
||||||
|
for p in ports_re_added:
|
||||||
if ovs_lib.BaseOVS().port_exists(p):
|
if ovs_lib.BaseOVS().port_exists(p):
|
||||||
|
events['re_added'] = [e for e in events['removed']
|
||||||
|
if e['name'] == p]
|
||||||
events['removed'] = [e for e in events['removed']
|
events['removed'] = [e for e in events['removed']
|
||||||
if e['name'] != p]
|
if e['name'] != p]
|
||||||
else:
|
else:
|
||||||
|
@ -1662,12 +1672,10 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
ports_not_ready_yet |= old_ports_not_ready_yet
|
ports_not_ready_yet |= old_ports_not_ready_yet
|
||||||
events['added'].extend(old_ports_not_ready_attrs)
|
events['added'].extend(old_ports_not_ready_attrs)
|
||||||
|
|
||||||
for port in events['added']:
|
for event_type in ('added', 'removed', 're_added'):
|
||||||
_process_port(port, port_info['added'],
|
for port in events.get(event_type, []):
|
||||||
ancillary_port_info['added'])
|
_process_port(port, port_info[event_type],
|
||||||
for port in events['removed']:
|
ancillary_port_info[event_type])
|
||||||
_process_port(port, port_info['removed'],
|
|
||||||
ancillary_port_info['removed'])
|
|
||||||
|
|
||||||
self._update_port_info_failed_devices_stats(port_info, failed_devices)
|
self._update_port_info_failed_devices_stats(port_info, failed_devices)
|
||||||
self._update_port_info_failed_devices_stats(ancillary_port_info,
|
self._update_port_info_failed_devices_stats(ancillary_port_info,
|
||||||
|
@ -1845,7 +1853,8 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
br.cleanup_tunnel_port(ofport)
|
br.cleanup_tunnel_port(ofport)
|
||||||
self.tun_br_ofports[tunnel_type].pop(remote_ip, None)
|
self.tun_br_ofports[tunnel_type].pop(remote_ip, None)
|
||||||
|
|
||||||
def treat_devices_added_or_updated(self, devices, provisioning_needed):
|
def treat_devices_added_or_updated(self, devices, provisioning_needed,
|
||||||
|
re_added):
|
||||||
skipped_devices = []
|
skipped_devices = []
|
||||||
need_binding_devices = []
|
need_binding_devices = []
|
||||||
binding_no_activated_devices = set()
|
binding_no_activated_devices = set()
|
||||||
|
@ -1891,6 +1900,8 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
need_binding_devices.append(details)
|
need_binding_devices.append(details)
|
||||||
self._update_port_network(details['port_id'],
|
self._update_port_network(details['port_id'],
|
||||||
details['network_id'])
|
details['network_id'])
|
||||||
|
if details['device'] in re_added:
|
||||||
|
self.ext_manager.delete_port(self.context, details)
|
||||||
self.ext_manager.handle_port(self.context, details)
|
self.ext_manager.handle_port(self.context, details)
|
||||||
else:
|
else:
|
||||||
if n_const.NO_ACTIVE_BINDING in details:
|
if n_const.NO_ACTIVE_BINDING in details:
|
||||||
|
@ -1996,6 +2007,7 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
# list at the same time; avoid processing it twice.
|
# list at the same time; avoid processing it twice.
|
||||||
devices_added_updated = (port_info.get('added', set()) |
|
devices_added_updated = (port_info.get('added', set()) |
|
||||||
port_info.get('updated', set()))
|
port_info.get('updated', set()))
|
||||||
|
re_added = port_info.get('re_added', set())
|
||||||
need_binding_devices = []
|
need_binding_devices = []
|
||||||
skipped_devices = set()
|
skipped_devices = set()
|
||||||
binding_no_activated_devices = set()
|
binding_no_activated_devices = set()
|
||||||
|
@ -2004,7 +2016,7 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
(skipped_devices, binding_no_activated_devices,
|
(skipped_devices, binding_no_activated_devices,
|
||||||
need_binding_devices, failed_devices['added']) = (
|
need_binding_devices, failed_devices['added']) = (
|
||||||
self.treat_devices_added_or_updated(
|
self.treat_devices_added_or_updated(
|
||||||
devices_added_updated, provisioning_needed))
|
devices_added_updated, provisioning_needed, re_added))
|
||||||
LOG.info("process_network_ports - iteration:%(iter_num)d - "
|
LOG.info("process_network_ports - iteration:%(iter_num)d - "
|
||||||
"treat_devices_added_or_updated completed. "
|
"treat_devices_added_or_updated completed. "
|
||||||
"Skipped %(num_skipped)d and no activated binding "
|
"Skipped %(num_skipped)d and no activated binding "
|
||||||
|
|
|
@ -40,6 +40,8 @@ from neutron.objects.ports import Port
|
||||||
from neutron.objects.ports import PortBinding
|
from neutron.objects.ports import PortBinding
|
||||||
from neutron.plugins.ml2.drivers.l2pop import rpc as l2pop_rpc
|
from neutron.plugins.ml2.drivers.l2pop import rpc as l2pop_rpc
|
||||||
from neutron.plugins.ml2.drivers.openvswitch.agent.common import constants
|
from neutron.plugins.ml2.drivers.openvswitch.agent.common import constants
|
||||||
|
from neutron.plugins.ml2.drivers.openvswitch.agent \
|
||||||
|
import ovs_dvr_neutron_agent
|
||||||
from neutron.plugins.ml2.drivers.openvswitch.agent import ovs_neutron_agent \
|
from neutron.plugins.ml2.drivers.openvswitch.agent import ovs_neutron_agent \
|
||||||
as ovs_agent
|
as ovs_agent
|
||||||
from neutron.tests import base
|
from neutron.tests import base
|
||||||
|
@ -415,24 +417,23 @@ class TestOvsNeutronAgent(object):
|
||||||
def test_scan_ports_returns_current_only_for_unchanged_ports(self):
|
def test_scan_ports_returns_current_only_for_unchanged_ports(self):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 3])
|
registered_ports = set([1, 3])
|
||||||
expected = {'current': vif_port_set,
|
expected = ovs_agent.PortInfo(current=vif_port_set)
|
||||||
'added': set(),
|
|
||||||
'removed': set()}
|
|
||||||
actual = self.mock_scan_ports(vif_port_set, registered_ports)
|
actual = self.mock_scan_ports(vif_port_set, registered_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
def test_scan_ports_returns_port_changes(self):
|
def test_scan_ports_returns_port_changes(self):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
expected = dict(current=vif_port_set, added=set([3]), removed=set([2]))
|
expected = ovs_agent.PortInfo(current=vif_port_set, added=set([3]),
|
||||||
|
removed=set([2]))
|
||||||
actual = self.mock_scan_ports(vif_port_set, registered_ports)
|
actual = self.mock_scan_ports(vif_port_set, registered_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
def test_scan_ports_returns_port_changes_with_sync(self):
|
def test_scan_ports_returns_port_changes_with_sync(self):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
expected = dict(current=vif_port_set, added=vif_port_set,
|
expected = ovs_agent.PortInfo(current=vif_port_set, added=vif_port_set,
|
||||||
removed=set([2]))
|
removed=set([2]))
|
||||||
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
||||||
sync=True)
|
sync=True)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
@ -440,8 +441,8 @@ class TestOvsNeutronAgent(object):
|
||||||
def _test_scan_ports_with_updated_ports(self, updated_ports):
|
def _test_scan_ports_with_updated_ports(self, updated_ports):
|
||||||
vif_port_set = set([1, 3, 4])
|
vif_port_set = set([1, 3, 4])
|
||||||
registered_ports = set([1, 2, 4])
|
registered_ports = set([1, 2, 4])
|
||||||
expected = dict(current=vif_port_set, added=set([3]),
|
expected = ovs_agent.PortInfo(current=vif_port_set, added={3},
|
||||||
removed=set([2]), updated=set([4]))
|
removed={2}, updated={4})
|
||||||
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
||||||
updated_ports)
|
updated_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
@ -458,8 +459,8 @@ class TestOvsNeutronAgent(object):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
updated_ports = set([1, 2])
|
updated_ports = set([1, 2])
|
||||||
expected = dict(current=vif_port_set, added=set([3]),
|
expected = ovs_agent.PortInfo(current=vif_port_set, added=set([3]),
|
||||||
removed=set([2]), updated=set([1]))
|
removed=set([2]), updated=set([1]))
|
||||||
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
||||||
updated_ports)
|
updated_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
@ -468,8 +469,7 @@ class TestOvsNeutronAgent(object):
|
||||||
vif_port_set = set([1, 2, 3])
|
vif_port_set = set([1, 2, 3])
|
||||||
registered_ports = set([1, 2, 3])
|
registered_ports = set([1, 2, 3])
|
||||||
updated_ports = set([2])
|
updated_ports = set([2])
|
||||||
expected = dict(current=vif_port_set, updated=set([2]),
|
expected = ovs_agent.PortInfo(current=vif_port_set, updated=set([2]))
|
||||||
added=set(), removed=set())
|
|
||||||
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
actual = self.mock_scan_ports(vif_port_set, registered_ports,
|
||||||
updated_ports)
|
updated_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
@ -507,12 +507,11 @@ class TestOvsNeutronAgent(object):
|
||||||
'name': 'qvof6f104bd-37'}]
|
'name': 'qvof6f104bd-37'}]
|
||||||
}
|
}
|
||||||
registered_ports = {port_id}
|
registered_ports = {port_id}
|
||||||
expected_ancillary = dict(current=set(), added=set(), removed=set())
|
expected_ancillary = ovs_agent.PortInfo()
|
||||||
|
|
||||||
# port was removed and then added
|
# port was removed and then added
|
||||||
expected_ports = dict(current={port_id},
|
expected_ports = ovs_agent.PortInfo(current={port_id}, added={port_id},
|
||||||
added={port_id},
|
re_added={port_id})
|
||||||
removed=set())
|
|
||||||
with mock.patch.object(ovs_lib.BaseOVS, "port_exists",
|
with mock.patch.object(ovs_lib.BaseOVS, "port_exists",
|
||||||
return_value=True):
|
return_value=True):
|
||||||
self._test_process_ports_events(events.copy(), registered_ports,
|
self._test_process_ports_events(events.copy(), registered_ports,
|
||||||
|
@ -520,9 +519,7 @@ class TestOvsNeutronAgent(object):
|
||||||
expected_ancillary)
|
expected_ancillary)
|
||||||
|
|
||||||
# port was added and then removed
|
# port was added and then removed
|
||||||
expected_ports = dict(current=set(),
|
expected_ports = ovs_agent.PortInfo(removed={port_id})
|
||||||
added=set(),
|
|
||||||
removed={port_id})
|
|
||||||
with mock.patch.object(ovs_lib.BaseOVS, "port_exists",
|
with mock.patch.object(ovs_lib.BaseOVS, "port_exists",
|
||||||
return_value=False):
|
return_value=False):
|
||||||
self._test_process_ports_events(events.copy(), registered_ports,
|
self._test_process_ports_events(events.copy(), registered_ports,
|
||||||
|
@ -533,10 +530,8 @@ class TestOvsNeutronAgent(object):
|
||||||
events = {'added': [], 'removed': []}
|
events = {'added': [], 'removed': []}
|
||||||
registered_ports = {1, 3}
|
registered_ports = {1, 3}
|
||||||
ancillary_ports = {2, 5}
|
ancillary_ports = {2, 5}
|
||||||
expected_ports = {'current': registered_ports, 'added': set(),
|
expected_ports = ovs_agent.PortInfo(current=registered_ports)
|
||||||
'removed': set()}
|
expected_ancillary = ovs_agent.PortInfo(current=ancillary_ports)
|
||||||
expected_ancillary = {'current': ancillary_ports, 'added': set(),
|
|
||||||
'removed': set()}
|
|
||||||
self._test_process_ports_events(events, registered_ports,
|
self._test_process_ports_events(events, registered_ports,
|
||||||
ancillary_ports, expected_ports,
|
ancillary_ports, expected_ports,
|
||||||
expected_ancillary)
|
expected_ancillary)
|
||||||
|
@ -545,9 +540,9 @@ class TestOvsNeutronAgent(object):
|
||||||
events = {'added': [], 'removed': []}
|
events = {'added': [], 'removed': []}
|
||||||
registered_ports = {1, 2, 3}
|
registered_ports = {1, 2, 3}
|
||||||
updated_ports = {2}
|
updated_ports = {2}
|
||||||
expected_ports = dict(current=registered_ports, updated={2},
|
expected_ports = ovs_agent.PortInfo(current=registered_ports,
|
||||||
added=set(), removed=set())
|
updated={2})
|
||||||
expected_ancillary = dict(current=set(), added=set(), removed=set())
|
expected_ancillary = ovs_agent.PortInfo()
|
||||||
self._test_process_ports_events(events, registered_ports,
|
self._test_process_ports_events(events, registered_ports,
|
||||||
set(), expected_ports,
|
set(), expected_ports,
|
||||||
expected_ancillary, updated_ports)
|
expected_ancillary, updated_ports)
|
||||||
|
@ -557,9 +552,8 @@ class TestOvsNeutronAgent(object):
|
||||||
'removed': [{'name': 'port2', 'ofport': 2,
|
'removed': [{'name': 'port2', 'ofport': 2,
|
||||||
'external_ids': {'attached-mac': 'test-mac'}}]}
|
'external_ids': {'attached-mac': 'test-mac'}}]}
|
||||||
registered_ports = {1}
|
registered_ports = {1}
|
||||||
expected_ports = dict(current=registered_ports, added=set(),
|
expected_ports = ovs_agent.PortInfo(current=registered_ports)
|
||||||
removed=set())
|
expected_ancillary = ovs_agent.PortInfo()
|
||||||
expected_ancillary = dict(current=set(), added=set(), removed=set())
|
|
||||||
devices_not_ready_yet = set()
|
devices_not_ready_yet = set()
|
||||||
with mock.patch.object(self.agent.int_br, 'portid_from_external_ids',
|
with mock.patch.object(self.agent.int_br, 'portid_from_external_ids',
|
||||||
side_effect=[2]), \
|
side_effect=[2]), \
|
||||||
|
@ -581,11 +575,11 @@ class TestOvsNeutronAgent(object):
|
||||||
'external_ids': {'attached-mac': 'test-mac'}}],
|
'external_ids': {'attached-mac': 'test-mac'}}],
|
||||||
'removed': []}
|
'removed': []}
|
||||||
old_devices_not_ready = {'port4'}
|
old_devices_not_ready = {'port4'}
|
||||||
registered_ports = set([1, 2, 3])
|
registered_ports = {1, 2, 3}
|
||||||
expected_ports = dict(current=set([1, 2, 3, 4]),
|
expected_ports = ovs_agent.PortInfo(current={1, 2, 3, 4}, added={4},
|
||||||
added=set([4]), removed=set())
|
removed=set())
|
||||||
self.agent.ancillary_brs = []
|
self.agent.ancillary_brs = []
|
||||||
expected_ancillary = dict(current=set(), added=set(), removed=set())
|
expected_ancillary = ovs_agent.PortInfo()
|
||||||
with mock.patch.object(self.agent.int_br, 'portid_from_external_ids',
|
with mock.patch.object(self.agent.int_br, 'portid_from_external_ids',
|
||||||
side_effect=[5, 4]), \
|
side_effect=[5, 4]), \
|
||||||
mock.patch.object(self.agent, 'check_changed_vlans',
|
mock.patch.object(self.agent, 'check_changed_vlans',
|
||||||
|
@ -616,11 +610,10 @@ class TestOvsNeutronAgent(object):
|
||||||
'external_ids': {'attached-mac': 'test-mac'}}]}
|
'external_ids': {'attached-mac': 'test-mac'}}]}
|
||||||
registered_ports = {1, 2, 4}
|
registered_ports = {1, 2, 4}
|
||||||
ancillary_ports = {5, 8}
|
ancillary_ports = {5, 8}
|
||||||
expected_ports = dict(current={1, 3, 4}, added={3}, removed={2})
|
expected_ports = ovs_agent.PortInfo(current={1, 3, 4}, added={3},
|
||||||
if updated_ports:
|
removed={2}, updated=updated_ports)
|
||||||
expected_ports['updated'] = updated_ports
|
expected_ancillary = ovs_agent.PortInfo(current={6, 8}, added={6},
|
||||||
expected_ancillary = dict(current={6, 8}, added={6},
|
removed={5})
|
||||||
removed={5})
|
|
||||||
ancillary_bridge = mock.Mock()
|
ancillary_bridge = mock.Mock()
|
||||||
ancillary_bridge.get_vif_port_set.return_value = {5, 6, 8}
|
ancillary_bridge.get_vif_port_set.return_value = {5, 6, 8}
|
||||||
self.agent.ancillary_brs = [ancillary_bridge]
|
self.agent.ancillary_brs = [ancillary_bridge]
|
||||||
|
@ -664,10 +657,8 @@ class TestOvsNeutronAgent(object):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
port_tags_dict = {1: []}
|
port_tags_dict = {1: []}
|
||||||
expected = dict(
|
expected = ovs_agent.PortInfo(added={3}, current=vif_port_set,
|
||||||
added=set([3]), current=vif_port_set,
|
removed={2}, updated={1})
|
||||||
removed=set([2]), updated=set([1])
|
|
||||||
)
|
|
||||||
with mock.patch.object(self.agent, 'tun_br', autospec=True), \
|
with mock.patch.object(self.agent, 'tun_br', autospec=True), \
|
||||||
mock.patch.object(self.agent.plugin_rpc,
|
mock.patch.object(self.agent.plugin_rpc,
|
||||||
'update_device_list') as upd_l:
|
'update_device_list') as upd_l:
|
||||||
|
@ -872,7 +863,7 @@ class TestOvsNeutronAgent(object):
|
||||||
return_value={}),\
|
return_value={}),\
|
||||||
mock.patch.object(self.agent, func_name) as func:
|
mock.patch.object(self.agent, func_name) as func:
|
||||||
skip_devs, _, need_bound_devices, _ = (
|
skip_devs, _, need_bound_devices, _ = (
|
||||||
self.agent.treat_devices_added_or_updated([], False))
|
self.agent.treat_devices_added_or_updated([], False, set()))
|
||||||
# The function should not raise
|
# The function should not raise
|
||||||
self.assertFalse(skip_devs)
|
self.assertFalse(skip_devs)
|
||||||
return func.called
|
return func.called
|
||||||
|
@ -890,7 +881,7 @@ class TestOvsNeutronAgent(object):
|
||||||
return_value={details['device']: port}),\
|
return_value={details['device']: port}),\
|
||||||
mock.patch.object(self.agent, 'port_dead') as func:
|
mock.patch.object(self.agent, 'port_dead') as func:
|
||||||
skip_devs, binding_no_activated_devices, _, _ = (
|
skip_devs, binding_no_activated_devices, _, _ = (
|
||||||
self.agent.treat_devices_added_or_updated([], False))
|
self.agent.treat_devices_added_or_updated([], False, set()))
|
||||||
self.assertFalse(skip_devs)
|
self.assertFalse(skip_devs)
|
||||||
self.assertTrue(func.called)
|
self.assertTrue(func.called)
|
||||||
self.assertIn('id', binding_no_activated_devices)
|
self.assertIn('id', binding_no_activated_devices)
|
||||||
|
@ -943,7 +934,7 @@ class TestOvsNeutronAgent(object):
|
||||||
mock.patch.object(self.agent, 'treat_vif_port',
|
mock.patch.object(self.agent, 'treat_vif_port',
|
||||||
return_value=False):
|
return_value=False):
|
||||||
|
|
||||||
self.agent.treat_devices_added_or_updated([], False)
|
self.agent.treat_devices_added_or_updated([], False, set())
|
||||||
|
|
||||||
def test_treat_devices_added_updated_skips_if_port_not_found(self):
|
def test_treat_devices_added_updated_skips_if_port_not_found(self):
|
||||||
dev_mock = mock.MagicMock()
|
dev_mock = mock.MagicMock()
|
||||||
|
@ -962,7 +953,8 @@ class TestOvsNeutronAgent(object):
|
||||||
"delete_port") as ext_mgr_delete_port,\
|
"delete_port") as ext_mgr_delete_port,\
|
||||||
mock.patch.object(self.agent,
|
mock.patch.object(self.agent,
|
||||||
'treat_vif_port') as treat_vif_port:
|
'treat_vif_port') as treat_vif_port:
|
||||||
skip_devs = self.agent.treat_devices_added_or_updated([], False)
|
skip_devs = self.agent.treat_devices_added_or_updated(
|
||||||
|
[], False, set())
|
||||||
# The function should return False for resync and no device
|
# The function should return False for resync and no device
|
||||||
# processed
|
# processed
|
||||||
self.assertEqual((['the_skipped_one'], set(), [], set()),
|
self.assertEqual((['the_skipped_one'], set(), [], set()),
|
||||||
|
@ -984,7 +976,7 @@ class TestOvsNeutronAgent(object):
|
||||||
'treat_vif_port') as treat_vif_port:
|
'treat_vif_port') as treat_vif_port:
|
||||||
failed_devices = {'added': set(), 'removed': set()}
|
failed_devices = {'added': set(), 'removed': set()}
|
||||||
(_, _, _, failed_devices['added']) = (
|
(_, _, _, failed_devices['added']) = (
|
||||||
self.agent.treat_devices_added_or_updated([], False))
|
self.agent.treat_devices_added_or_updated([], False, set()))
|
||||||
# The function should return False for resync and no device
|
# The function should return False for resync and no device
|
||||||
# processed
|
# processed
|
||||||
self.assertEqual(set([dev_mock]), failed_devices.get('added'))
|
self.assertEqual(set([dev_mock]), failed_devices.get('added'))
|
||||||
|
@ -1015,7 +1007,7 @@ class TestOvsNeutronAgent(object):
|
||||||
mock.patch.object(self.agent,
|
mock.patch.object(self.agent,
|
||||||
'treat_vif_port') as treat_vif_port:
|
'treat_vif_port') as treat_vif_port:
|
||||||
skip_devs, _, need_bound_devices, _ = (
|
skip_devs, _, need_bound_devices, _ = (
|
||||||
self.agent.treat_devices_added_or_updated([], False))
|
self.agent.treat_devices_added_or_updated([], False, set()))
|
||||||
# The function should return False for resync
|
# The function should return False for resync
|
||||||
self.assertFalse(skip_devs)
|
self.assertFalse(skip_devs)
|
||||||
self.assertTrue(treat_vif_port.called)
|
self.assertTrue(treat_vif_port.called)
|
||||||
|
@ -1146,7 +1138,7 @@ class TestOvsNeutronAgent(object):
|
||||||
port_info.get('updated', set()))
|
port_info.get('updated', set()))
|
||||||
if devices_added_updated:
|
if devices_added_updated:
|
||||||
device_added_updated.assert_called_once_with(
|
device_added_updated.assert_called_once_with(
|
||||||
devices_added_updated, False)
|
devices_added_updated, False, set())
|
||||||
if port_info.get('removed', set()):
|
if port_info.get('removed', set()):
|
||||||
device_removed.assert_called_once_with(port_info['removed'])
|
device_removed.assert_called_once_with(port_info['removed'])
|
||||||
if skipped_devices:
|
if skipped_devices:
|
||||||
|
@ -2820,24 +2812,23 @@ class AncillaryBridgesTest(object):
|
||||||
def test_scan_ancillary_ports_returns_cur_only_for_unchanged_ports(self):
|
def test_scan_ancillary_ports_returns_cur_only_for_unchanged_ports(self):
|
||||||
vif_port_set = set([1, 2])
|
vif_port_set = set([1, 2])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
expected = dict(current=vif_port_set,
|
expected = ovs_agent.PortInfo(current=vif_port_set)
|
||||||
added=set(),
|
|
||||||
removed=set())
|
|
||||||
actual = self.mock_scan_ancillary_ports(vif_port_set, registered_ports)
|
actual = self.mock_scan_ancillary_ports(vif_port_set, registered_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
def test_scan_ancillary_ports_returns_port_changes(self):
|
def test_scan_ancillary_ports_returns_port_changes(self):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
expected = dict(current=vif_port_set, added=set([3]), removed=set([2]))
|
expected = ovs_agent.PortInfo(current=vif_port_set, added={3},
|
||||||
|
removed={2})
|
||||||
actual = self.mock_scan_ancillary_ports(vif_port_set, registered_ports)
|
actual = self.mock_scan_ancillary_ports(vif_port_set, registered_ports)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
def test_scan_ancillary_ports_returns_port_changes_with_sync(self):
|
def test_scan_ancillary_ports_returns_port_changes_with_sync(self):
|
||||||
vif_port_set = set([1, 3])
|
vif_port_set = set([1, 3])
|
||||||
registered_ports = set([1, 2])
|
registered_ports = set([1, 2])
|
||||||
expected = dict(current=vif_port_set, added=vif_port_set,
|
expected = ovs_agent.PortInfo(current=vif_port_set, added=vif_port_set,
|
||||||
removed=set([2]))
|
removed={2})
|
||||||
actual = self.mock_scan_ancillary_ports(vif_port_set, registered_ports,
|
actual = self.mock_scan_ancillary_ports(vif_port_set, registered_ports,
|
||||||
sync=True)
|
sync=True)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
@ -3676,7 +3667,8 @@ class TestOvsDvrNeutronAgent(object):
|
||||||
'get_dvr_mac_address_by_host',
|
'get_dvr_mac_address_by_host',
|
||||||
side_effect=oslo_messaging.RemoteError),\
|
side_effect=oslo_messaging.RemoteError),\
|
||||||
mock.patch.object(self.agent, 'int_br', new=int_br),\
|
mock.patch.object(self.agent, 'int_br', new=int_br),\
|
||||||
mock.patch.object(self.agent.dvr_agent, 'int_br', new=int_br):
|
mock.patch.object(self.agent.dvr_agent, 'int_br', new=int_br),\
|
||||||
|
mock.patch.object(ovs_dvr_neutron_agent.LOG, 'error'):
|
||||||
with testtools.ExpectedException(SystemExit):
|
with testtools.ExpectedException(SystemExit):
|
||||||
self.agent.dvr_agent.get_dvr_mac_address()
|
self.agent.dvr_agent.get_dvr_mac_address()
|
||||||
self.assertIsNone(self.agent.dvr_agent.dvr_mac_address)
|
self.assertIsNone(self.agent.dvr_agent.dvr_mac_address)
|
||||||
|
|
Loading…
Reference in New Issue