Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
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)
Esempio n. 8
0
    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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)
Esempio n. 11
0
    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)
Esempio n. 12
0
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
Esempio n. 13
0
    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)
Esempio n. 14
0
    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)
Esempio n. 15
0
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)