def test_delete_quantum_ports(self): port1 = ovs_lib.VifPort('tap1234', 1, uuidutils.generate_uuid(), 'ca:fe:de:ad:be:ef', 'br') port2 = ovs_lib.VifPort('tap5678', 2, uuidutils.generate_uuid(), 'ca:ee:de:ad:be:ef', 'br') self.mox.StubOutWithMock(self.br, 'get_vif_ports') self.br.get_vif_ports().AndReturn([port1, port2]) self.mox.StubOutWithMock(self.br, 'delete_port') self.br.delete_port('tap1234') self.br.delete_port('tap5678') self.mox.ReplayAll() self.br.delete_ports(all_ports=False) self.mox.VerifyAll()
def test_collect_quantum_ports(self): port1 = ovs_lib.VifPort('tap1234', 1, uuidutils.generate_uuid(), '11:22:33:44:55:66', 'br') port2 = ovs_lib.VifPort('tap5678', 2, uuidutils.generate_uuid(), '77:88:99:aa:bb:cc', 'br') port3 = ovs_lib.VifPort('tap90ab', 3, uuidutils.generate_uuid(), '99:00:aa:bb:cc:dd', 'br') ports = [[port1, port2], [port3]] portnames = [p.port_name for p in itertools.chain(*ports)] with mock.patch('quantum.agent.linux.ovs_lib.OVSBridge') as ovs: ovs.return_value.get_vif_ports.side_effect = ports bridges = ['br-int', 'br-ex'] ret = util.collect_quantum_ports(bridges, 'dummy_sudo') self.assertEqual(ret, portnames)
def _test_report_state(self, fail_mode): log_mocked = mock.patch.object(nec_quantum_agent, 'LOG') log_patched = log_mocked.start() def record_state(*args, **kwargs): self.record_calls.append(copy.deepcopy(args)) if fail_mode: raise Exception() self.record_calls = [] self.num_ports_hist = [] state_rpc = self.state_rpc_api.return_value state_rpc.report_state.side_effect = record_state dummy_vif = ovs_lib.VifPort('port1', '1', 'id-1', 'mac-1', None) self.state_rpc_api.assert_called_once_with('q-plugin') self.assertTrue('start_flag' in self.agent.agent_state) self._check_report_state([], 0, fail_mode, first=True) self._check_report_state([dummy_vif] * 2, 2, fail_mode) self._check_report_state([dummy_vif] * 5, 5, fail_mode) self._check_report_state([], 0, fail_mode) print 'record_state', self.record_calls print 'num_ports_hist', self.num_ports_hist # Since loopingcall start is mocked, call_count is same as # the call count of check_report_state. self.assertEqual(state_rpc.report_state.call_count, 4) self.assertEqual(len(self.record_calls), 4) for i, x in enumerate( itertools.izip(self.record_calls, self.num_ports_hist)): rec, num_ports = x expected_state = { 'binary': 'quantum-nec-agent', 'host': 'dummy-host', 'topic': 'N/A', 'configurations': { 'devices': 0 }, 'agent_type': 'NEC plugin agent' } expected_state['configurations']['devices'] = num_ports if i == 0 or fail_mode: expected_state['start_flag'] = True self.assertEqual(expected_state, rec[1]) self.assertEqual(fail_mode, log_patched.exception.called)
def test_vifport(self): """create and stringify vif port, confirm no exceptions""" self.mox.ReplayAll() pname = "vif1.0" ofport = 5 vif_id = str(uuid.uuid4()) mac = "ca:fe:de:ad:be:ef" # test __init__ port = ovs_lib.VifPort(pname, ofport, vif_id, mac, self.br) self.assertEqual(port.port_name, pname) self.assertEqual(port.ofport, ofport) self.assertEqual(port.vif_id, vif_id) self.assertEqual(port.vif_mac, mac) self.assertEqual(port.switch.br_name, self.BR_NAME) # test __str__ foo = str(port) self.mox.VerifyAll()
def test_port_update(self): with contextlib.nested( mock.patch.object(ovs_lib.OVSBridge, 'get_vif_port_by_id'), mock.patch.object(self.agent.sg_agent, 'refresh_firewall')) as (get_vif_port_by_id, refresh_firewall): context = mock.Mock() vifport = ovs_lib.VifPort('port1', '1', 'id-1', 'mac-1', self.agent.int_br) # The OVS port does not exist. get_vif_port_by_id.return_value = None port = {'id': 'update-port-1'} self.agent.callback_nec.port_update(context, port=port) self.assertEqual(get_vif_port_by_id.call_count, 1) self.assertFalse(refresh_firewall.call_count) # The OVS port exists but no security group is associated. get_vif_port_by_id.return_value = vifport port = {'id': 'update-port-1'} self.agent.callback_nec.port_update(context, port=port) self.assertEqual(get_vif_port_by_id.call_count, 2) self.assertFalse(refresh_firewall.call_count) # The OVS port exists but a security group is associated. get_vif_port_by_id.return_value = vifport port = {'id': 'update-port-1', ext_sg.SECURITYGROUPS: ['default']} self.agent.callback_nec.port_update(context, port=port) self.assertEqual(get_vif_port_by_id.call_count, 3) self.assertEqual(refresh_firewall.call_count, 1) get_vif_port_by_id.return_value = None port = {'id': 'update-port-1', ext_sg.SECURITYGROUPS: ['default']} self.agent.callback_nec.port_update(context, port=port) self.assertEqual(get_vif_port_by_id.call_count, 4) self.assertEqual(refresh_firewall.call_count, 1)
import mox from quantum.agent.linux import ovs_lib from quantum.plugins.openvswitch.agent import ovs_quantum_agent # Useful global dummy variables. NET_UUID = '3faeebfe-5d37-11e1-a64b-000c29d5f0a7' LS_ID = '42' LV_ID = 42 LV_IDS = [42, 43] LVM = ovs_quantum_agent.LocalVLANMapping(LV_ID, 'gre', None, LS_ID, LV_IDS) VIF_ID = '404deaec-5d37-11e1-a64b-000c29d5f0a8' VIF_MAC = '3c:09:24:1e:78:23' OFPORT_NUM = 1 VIF_PORT = ovs_lib.VifPort('port', OFPORT_NUM, VIF_ID, VIF_MAC, 'switch') BCAST_MAC = "01:00:00:00:00:00/01:00:00:00:00:00" class DummyPort: def __init__(self, interface_id): self.interface_id = interface_id class DummyVlanBinding: def __init__(self, network_id, vlan_id): self.network_id = network_id self.vlan_id = vlan_id class TunnelTest(unittest.TestCase):
def test_daemon_loop(self): def state_check(index): self.assertEqual(len(self.vif_ports_scenario[index]), len(self.agent.cur_ports)) # Fake time.sleep to stop the infinite loop in daemon_loop() self.sleep_count = 0 def sleep_mock(*args, **kwargs): state_check(self.sleep_count) self.sleep_count += 1 if self.sleep_count >= DAEMON_LOOP_COUNT: raise RuntimeError() vif_ports = [ ovs_lib.VifPort('port1', '1', 'id-1', 'mac-1', self.agent.int_br), ovs_lib.VifPort('port2', '2', 'id-2', 'mac-2', self.agent.int_br) ] self.vif_ports_scenario = [[], [], vif_ports[0:1], vif_ports[0:2], vif_ports[1:2], []] # Ensure vif_ports_scenario is longer than DAEMON_LOOP_COUNT if len(self.vif_ports_scenario) < DAEMON_LOOP_COUNT: self.vif_ports_scenario.extend( [] for _i in xrange(DAEMON_LOOP_COUNT - len(self.vif_ports_scenario))) with contextlib.nested( mock.patch.object(time, 'sleep', side_effect=sleep_mock), mock.patch.object(ovs_lib.OVSBridge, 'get_vif_ports'), mock.patch.object(nec_quantum_agent.NECPluginApi, 'update_ports'), mock.patch.object(self.agent.sg_agent, 'prepare_devices_filter'), mock.patch.object( self.agent.sg_agent, 'remove_devices_filter')) as (sleep, get_vif_potrs, update_ports, prepare_devices_filter, remove_devices_filter): get_vif_potrs.side_effect = self.vif_ports_scenario with testtools.ExpectedException(RuntimeError): self.agent.daemon_loop() self.assertEqual(update_ports.call_count, 4) self.assertEqual(sleep.call_count, DAEMON_LOOP_COUNT) agent_id = 'nec-q-agent.dummy-host' expected = [ mock.call(mock.ANY, agent_id, OVS_DPID_0X, [{ 'id': 'id-1', 'mac': 'mac-1', 'port_no': '1' }], []), mock.call(mock.ANY, agent_id, OVS_DPID_0X, [{ 'id': 'id-2', 'mac': 'mac-2', 'port_no': '2' }], []), mock.call(mock.ANY, agent_id, OVS_DPID_0X, [], ['id-1']), mock.call(mock.ANY, agent_id, OVS_DPID_0X, [], ['id-2']) ] update_ports.assert_has_calls(expected) expected = [mock.call(['id-1']), mock.call(['id-2'])] self.assertEqual(prepare_devices_filter.call_count, 2) prepare_devices_filter.assert_has_calls(expected) self.assertEqual(remove_devices_filter.call_count, 2) remove_devices_filter.assert_has_calls(expected) sleep.assert_called_with(self.agent.polling_interval)
import unittest import mox from quantum.plugins.openvswitch.agent import ovs_quantum_agent from quantum.agent.linux import ovs_lib # Useful global dummy variables. NET_UUID = '3faeebfe-5d37-11e1-a64b-000c29d5f0a7' LS_ID = '42' LV_ID = 42 LV_IDS = [42, 43] LVM = ovs_quantum_agent.LocalVLANMapping(LV_ID, LS_ID, LV_IDS) VIF_ID = '404deaec-5d37-11e1-a64b-000c29d5f0a8' VIF_MAC = '3c:09:24:1e:78:23' VIF_PORT = ovs_lib.VifPort('port', 'ofport', VIF_ID, VIF_MAC, 'switch') class DummyPort: def __init__(self, interface_id): self.interface_id = interface_id class DummyVlanBinding: def __init__(self, network_id, vlan_id): self.network_id = network_id self.vlan_id = vlan_id class TunnelTest(unittest.TestCase):