def test_get_link_from_interface(self): """Test _get_link_from_interface.""" mock_switch_a = get_switch_mock("00:00:00:00:00:00:00:01", 0x04) mock_switch_b = get_switch_mock("00:00:00:00:00:00:00:02", 0x04) mock_interface_a = get_interface_mock('s1-eth1', 1, mock_switch_a) mock_interface_b = get_interface_mock('s2-eth1', 1, mock_switch_b) mock_interface_c = get_interface_mock('s2-eth1', 2, mock_switch_b) mock_link = get_link_mock(mock_interface_a, mock_interface_b) self.napp.links = {'0e2b5d7bc858b9f38db11b69': mock_link} response = self.napp._get_link_from_interface(mock_interface_a) self.assertEqual(response, mock_link) response = self.napp._get_link_from_interface(mock_interface_c) self.assertEqual(response, None)
def test_get_link_or_create(self): """Test _get_link_or_create.""" dpid_a = "00:00:00:00:00:00:00:01" dpid_b = "00:00:00:00:00:00:00:02" mock_switch_a = get_switch_mock(dpid_a, 0x04) mock_switch_b = get_switch_mock(dpid_b, 0x04) mock_interface_a = get_interface_mock('s1-eth1', 1, mock_switch_a) mock_interface_b = get_interface_mock('s2-eth1', 1, mock_switch_b) mock_interface_a.id = dpid_a mock_interface_b.id = dpid_b link = self.napp._get_link_or_create(mock_interface_a, mock_interface_b) self.assertEqual(link.endpoint_a.id, dpid_a) self.assertEqual(link.endpoint_b.id, dpid_b)
def test_add_interface_metadata(self, mock_metadata_changes): """Test add_interface_metadata.""" interface_id = '00:00:00:00:00:00:00:01:1' dpid = '00:00:00:00:00:00:00:01' mock_switch = get_switch_mock(dpid) mock_interface = get_interface_mock('s1-eth1', 1, mock_switch) mock_interface.metadata = {"metada": "A"} mock_switch.interfaces = {1: mock_interface} self.napp.controller.switches = {dpid: mock_switch} api = get_test_client(self.napp.controller, self.napp) url = f'{self.server_name_url}/v3/interfaces/{interface_id}/metadata' payload = {"metada": "A"} response = api.post(url, data=json.dumps(payload), content_type='application/json') self.assertEqual(response.status_code, 201, response.data) mock_metadata_changes.assert_called() # fail case switch not found interface_id = '00:00:00:00:00:00:00:02:1' url = f'{self.server_name_url}/v3/interfaces/{interface_id}/metadata' response = api.post(url, data=json.dumps(payload), content_type='application/json') self.assertEqual(response.status_code, 404, response.data) # fail case interface not found interface_id = '00:00:00:00:00:00:00:01:2' url = f'{self.server_name_url}/v3/interfaces/{interface_id}/metadata' response = api.post(url, data=json.dumps(payload), content_type='application/json') self.assertEqual(response.status_code, 404, response.data)
def test_get_interface_metadata(self): """Test get_interface_metada.""" interface_id = '00:00:00:00:00:00:00:01:1' dpid = '00:00:00:00:00:00:00:01' mock_switch = get_switch_mock(dpid) mock_interface = get_interface_mock('s1-eth1', 1, mock_switch) mock_interface.metadata = {"metada": "A"} mock_switch.interfaces = {1: mock_interface} self.napp.controller.switches = {dpid: mock_switch} api = get_test_client(self.napp.controller, self.napp) url = f'{self.server_name_url}/v3/interfaces/{interface_id}/metadata' response = api.get(url) self.assertEqual(response.status_code, 200, response.data) # fail case switch not found interface_id = '00:00:00:00:00:00:00:02:1' url = f'{self.server_name_url}/v3/interfaces/{interface_id}/metadata' response = api.get(url) self.assertEqual(response.status_code, 404, response.data) # fail case interface not found interface_id = '00:00:00:00:00:00:00:01:2' url = f'{self.server_name_url}/v3/interfaces/{interface_id}/metadata' response = api.get(url) self.assertEqual(response.status_code, 404, response.data)
def test_restore_network_status(self): """Test restore_network_status.""" dpid = '00:00:00:00:00:00:00:01' mock_switch = get_switch_mock(dpid) mock_switch.id = dpid mock_interface = get_interface_mock('s1-eth1', 1, mock_switch) mock_switch.interfaces = {1: mock_interface} self.napp.controller.switches = {dpid: mock_switch} self.napp.switches_state = {dpid: True} self.napp.interfaces_state = { '00:00:00:00:00:00:00:01:1': (True, True) } # enable self.napp.restore_network_status(mock_switch) self.assertEqual(mock_switch.enable.call_count, 1) self.assertEqual(mock_interface.enable.call_count, 1) self.assertEqual(mock_interface.lldp, True) # disable self.napp.switches_state = {dpid: False} self.napp.interfaces_state = { '00:00:00:00:00:00:00:01:1': (False, False) } self.napp.restore_network_status(mock_switch) self.assertEqual(mock_switch.disable.call_count, 1) self.assertEqual(mock_interface.disable.call_count, 1) self.assertEqual(mock_interface.lldp, False)
def test_disable_interfaces(self, mock_save_status): """Test disable_interfaces.""" interface_id = '00:00:00:00:00:00:00:01:1' dpid = '00:00:00:00:00:00:00:01' mock_switch = get_switch_mock(dpid) mock_interface_1 = get_interface_mock('s1-eth1', 1, mock_switch) mock_interface_2 = get_interface_mock('s1-eth2', 2, mock_switch) mock_switch.interfaces = {1: mock_interface_1, 2: mock_interface_2} self.napp.controller.switches = {dpid: mock_switch} api = get_test_client(self.napp.controller, self.napp) url = f'{self.server_name_url}/v3/interfaces/{interface_id}/disable' response = api.post(url) self.assertEqual(response.status_code, 200, response.data) self.assertEqual(mock_interface_1.disable.call_count, 1) self.assertEqual(mock_interface_2.disable.call_count, 0) mock_save_status.assert_called() mock_interface_1.disable.call_count = 0 mock_interface_2.disable.call_count = 0 url = f'{self.server_name_url}/v3/interfaces/switch/{dpid}/disable' response = api.post(url) self.assertEqual(response.status_code, 200, response.data) self.assertEqual(mock_interface_1.disable.call_count, 1) self.assertEqual(mock_interface_2.disable.call_count, 1) # test interface not found interface_id = '00:00:00:00:00:00:00:01:3' mock_interface_1.disable.call_count = 0 mock_interface_2.disable.call_count = 0 url = f'{self.server_name_url}/v3/interfaces/{interface_id}/disable' response = api.post(url) self.assertEqual(response.status_code, 409, response.data) self.assertEqual(mock_interface_1.disable.call_count, 0) self.assertEqual(mock_interface_2.disable.call_count, 0) # test switch not found dpid = '00:00:00:00:00:00:00:02' url = f'{self.server_name_url}/v3/interfaces/switch/{dpid}/disable' response = api.post(url) self.assertEqual(response.status_code, 404, response.data) self.assertEqual(mock_interface_1.disable.call_count, 0) self.assertEqual(mock_interface_2.disable.call_count, 0)
def test_fail_restore_link(self): """Test fail restore_link.""" dpid = '00:00:00:00:00:00:00:01' dpid_b = '00:00:00:00:00:00:00:02' link_id = '4d42dc08522' link_id_fail = '4cd52' mock_switch_a = get_switch_mock(dpid) mock_switch_b = get_switch_mock(dpid_b) mock_interface_a_1 = get_interface_mock('s1-eth1', 1, mock_switch_a) mock_interface_b_1 = get_interface_mock('s2-eth1', 1, mock_switch_b) mock_link = get_link_mock(mock_interface_a_1, mock_interface_b_1) mock_link.id = link_id self.napp.links = {link_id: mock_link} self.napp.links_state = {link_id: {"enabled": True}} with self.assertRaises(RestoreError): self.napp._restore_link(link_id_fail) self.napp.links_state = {link_id_fail: {"enabled": True}} with self.assertRaises(RestoreError): self.napp._restore_link(link_id_fail)
def test_interface_mock(self): """Test interface mock.""" switch = MagicMock() switch.dpid = "00:00:00:00:00:00:00:01" interface_mock = get_interface_mock('name', 123, switch) self.assertEqual(interface_mock.id, '00:00:00:00:00:00:00:01:123') self.assertEqual(interface_mock.name, 'name') self.assertEqual(interface_mock.port_number, 123) self.assertEqual(interface_mock.switch, switch) self.assertEqual(interface_mock.address, '00:00:00:00:00:00') self.assertTrue(interface_mock.lldp)
def test_restore_links(self): """Test restore_link.""" dpid = '00:00:00:00:00:00:00:01' dpid_b = '00:00:00:00:00:00:00:02' link_id = '4d42dc08522' mock_switch_a = get_switch_mock(dpid) mock_switch_b = get_switch_mock(dpid_b) mock_interface_a_1 = get_interface_mock('s1-eth1', 1, mock_switch_a) mock_interface_b_1 = get_interface_mock('s2-eth1', 1, mock_switch_b) mock_link = get_link_mock(mock_interface_a_1, mock_interface_b_1) mock_link.id = link_id self.napp.links = {link_id: mock_link} self.napp.links_state = {link_id: {'enabled': True}} # enable link self.napp.restore_network_status(mock_link) self.assertEqual(mock_link.enable.call_count, 1) # disable link self.napp.links_state = {link_id: {"enabled": False}} self.napp._verified_links = [] self.napp.restore_network_status(mock_link) self.assertEqual(mock_link.disable.call_count, 1)
def test_fail_restore_switch(self): """Test fail restore_switch.""" dpid = '00:00:00:00:00:00:00:01' dpid_fail = '00:00:00:00:00:00:00:06' mock_switch = get_switch_mock(dpid) mock_switch.id = dpid mock_interface = get_interface_mock('s1-eth1', 1, mock_switch) mock_switch.interfaces = {1: mock_interface} self.napp.controller.switche = {dpid: mock_switch} self.napp.switches_state = {dpid: True} self.napp.interfaces_state = { '00:00:00:00:00:00:00:01:1': (True, True) } with self.assertRaises(RestoreError): self.napp._restore_switch(dpid_fail) self.napp.switches_state = {dpid_fail: True} with self.assertRaises(RestoreError): self.napp._restore_switch(dpid_fail)
def test_delete_interface_metadata(self): """Test delete_interface_metadata.""" interface_id = '00:00:00:00:00:00:00:01:1' dpid = '00:00:00:00:00:00:00:01' iface_url = '/v3/interfaces/' mock_switch = get_switch_mock(dpid) mock_interface = get_interface_mock('s1-eth1', 1, mock_switch) mock_interface.remove_metadata.side_effect = [True, False] mock_interface.metadata = {"metada": "A"} mock_switch.interfaces = {1: mock_interface} self.napp.controller.switches = { '00:00:00:00:00:00:00:01': mock_switch } api = get_test_client(self.napp.controller, self.napp) key = 'A' url = f'{self.server_name_url}{iface_url}{interface_id}/metadata/{key}' response = api.delete(url) self.assertEqual(response.status_code, 200, response.data) # fail case switch not found key = 'A' interface_id = '00:00:00:00:00:00:00:02:1' url = f'{self.server_name_url}{iface_url}{interface_id}/metadata/{key}' response = api.delete(url) self.assertEqual(response.status_code, 404, response.data) # fail case interface not found key = 'A' interface_id = '00:00:00:00:00:00:00:01:2' url = f'{self.server_name_url}{iface_url}{interface_id}/metadata/{key}' response = api.delete(url) self.assertEqual(response.status_code, 404, response.data) # fail case metadata not found key = 'A' interface_id = '00:00:00:00:00:00:00:01:1' url = f'{self.server_name_url}{iface_url}{interface_id}/metadata/{key}' response = api.delete(url) self.assertEqual(response.status_code, 404, response.data)
def get_topology_mock(): """Create a default topology.""" switch_a = get_switch_mock("00:00:00:00:00:00:00:01", 0x04) switch_b = get_switch_mock("00:00:00:00:00:00:00:02", 0x04) switch_c = get_switch_mock("00:00:00:00:00:00:00:03", 0x01) interface_a1 = get_interface_mock("s1-eth1", 1, switch_a) interface_a2 = get_interface_mock("s1-eth2", 2, switch_a) interface_b1 = get_interface_mock("s2-eth1", 1, switch_b) interface_b2 = get_interface_mock("s2-eth2", 2, switch_b) interface_c1 = get_interface_mock("s3-eth1", 1, switch_c) interface_c2 = get_interface_mock("s3-eth2", 2, switch_c) switch_a.interfaces = { interface_a1.id: interface_a1, interface_a2.id: interface_a2 } switch_b.interfaces = { interface_b1.id: interface_b1, interface_b2.id: interface_b2 } switch_c.interfaces = { interface_c1.id: interface_c1, interface_c2.id: interface_c2 } link_1 = get_link_mock(interface_a1, interface_b1) link_2 = get_link_mock(interface_a2, interface_c1) link_3 = get_link_mock(interface_b2, interface_c2) topology = MagicMock() topology.links = {"1": link_1, "2": link_2, "3": link_3} topology.switches = { switch_a.dpid: switch_a, switch_b.dpid: switch_b, switch_c.dpid: switch_c } return topology
def test_get_topology(self): """Test get_topology.""" dpid_a = "00:00:00:00:00:00:00:01" dpid_b = "00:00:00:00:00:00:00:02" expected = { "topology": { "switches": { "00:00:00:00:00:00:00:01": { "metadata": { "lat": "0.0", "lng": "-30.0" } }, "00:00:00:00:00:00:00:02": { "metadata": { "lat": "0.0", "lng": "-30.0" } } }, "links": { "cf0f4071be4": { "id": "cf0f4071be4" } } } } mock_switch_a = get_switch_mock(dpid_a, 0x04) mock_switch_b = get_switch_mock(dpid_b, 0x04) mock_interface_a = get_interface_mock('s1-eth1', 1, mock_switch_a) mock_interface_b = get_interface_mock('s2-eth1', 1, mock_switch_b) mock_link = get_link_mock(mock_interface_a, mock_interface_b) mock_link.id = 'cf0f4071be4' mock_switch_a.id = dpid_a mock_switch_a.as_dict.return_value = { 'metadata': { 'lat': '0.0', 'lng': '-30.0' } } mock_switch_b.id = dpid_b mock_switch_b.as_dict.return_value = { 'metadata': { 'lat': '0.0', 'lng': '-30.0' } } self.napp.controller.switches = { dpid_a: mock_switch_a, dpid_b: mock_switch_b } self.napp.links = {"cf0f4071be4": mock_link} mock_link.as_dict.return_value = {"id": "cf0f4071be4"} api = get_test_client(self.napp.controller, self.napp) url = f'{self.server_name_url}/v3/' response = api.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(json.loads(response.data), expected)
def test_restore_network_status(self, mock_storehouse): """Test restore_network_status.""" dpid = '00:00:00:00:00:00:00:01' dpid_b = '00:00:00:00:00:00:00:02' mock_switch_a = get_switch_mock(dpid) mock_switch_b = get_switch_mock(dpid_b) mock_interface_a_1 = get_interface_mock('s1-eth1', 1, mock_switch_a) mock_interface_a_2 = get_interface_mock('s1-eth2', 2, mock_switch_b) mock_interface_b_1 = get_interface_mock('s2-eth1', 1, mock_switch_b) mock_interface_b_2 = get_interface_mock('s2-eth2', 2, mock_switch_b) mock_link = get_link_mock(mock_interface_a_1, mock_interface_b_1) mock_switch_a.interfaces = { 1: mock_interface_a_1, 2: mock_interface_a_2 } mock_switch_b.interfaces = { 1: mock_interface_b_1, 2: mock_interface_b_2 } self.napp.controller.switches = { dpid: mock_switch_a, dpid_b: mock_switch_b } self.napp.links = {'4d42dc08522': mock_link} status = { 'network_status': { 'id': 'network_status', 'links': { '4d42dc08522': { 'enabled': True, 'endpoint_a': { 'switch': '00:00:00:00:00:00:00:01', 'id': '00:00:00:00:00:00:00:00:1' }, 'endpoint_b': { 'switch': '00:00:00:00:00:00:00:01', 'id': '00:00:00:00:00:00:00:00:2' } } }, 'switches': { '00:00:00:00:00:00:00:01': { 'dpid': '00:00:00:00:00:00:00:01', 'enabled': True, 'id': '00:00:00:00:00:00:00:01', 'interfaces': { '00:00:00:00:00:00:00:01:1': { 'enabled': True, 'lldp': True, 'id': '00:00:00:00:00:00:00:00:1', } } } } } } status_disable = { 'network_status': { 'id': 'network_status', 'links': { '4d42dc08522': { 'enabled': False, 'endpoint_a': { 'switch': '00:00:00:00:00:00:00:01', 'id': '00:00:00:00:00:00:00:00:1' }, 'endpoint_b': { 'switch': '00:00:00:00:00:00:00:01', 'id': '00:00:00:00:00:00:00:00:2' } } }, 'switches': { '00:00:00:00:00:00:00:01': { 'dpid': '00:00:00:00:00:00:00:01', 'enabled': False, 'id': '00:00:00:00:00:00:00:01', 'interfaces': { '00:00:00:00:00:00:00:01:1': { 'enabled': False, 'lldp': False, 'id': '00:00:00:00:00:00:00:01:1', } } } } } } api = get_test_client(self.napp.controller, self.napp) mock_storehouse.side_effect = [{}, status, status_disable] # fail case url = f'{self.server_name_url}/v3/restore' response = api.get(url) self.assertEqual(response.status_code, 404, response.data) # enable url = f'{self.server_name_url}/v3/restore' response = api.get(url) self.assertEqual(response.status_code, 200, response.data) self.assertEqual(mock_switch_a.enable.call_count, 1) self.assertEqual(mock_interface_a_1.enable.call_count, 1) self.assertEqual(mock_interface_a_1.lldp, True) self.assertEqual(mock_link.enable.call_count, 1) # disable url = f'{self.server_name_url}/v3/restore' response = api.get(url) self.assertEqual(response.status_code, 200, response.data) self.assertEqual(mock_switch_a.disable.call_count, 1) self.assertEqual(mock_interface_a_1.disable.call_count, 1) self.assertEqual(mock_interface_a_1.lldp, False) self.assertEqual(mock_link.disable.call_count, 1)
def _get_interfaces(count, switch): """Add a new interface to the list of interfaces.""" for i in range(1, count + 1): yield get_interface_mock("", i, switch)