kytos-ng / kytos-end-to-end-tests

Kytos End-to-End Tests
0 stars 10 forks source link

rerun TestE2ESDNTrace::test_020_run_sdntrace_fail_missing_flow #328

Open viniarck opened 4 days ago

viniarck commented 4 days ago

Rerun on 2024-10-14

rerun: 0
tests/test_e2e_40_sdntrace.py::TestE2ESDNTrace::test_020_run_sdntrace_fail_missing_flow: 2024-10-14,06:55:31.533146 - 2024-10-14,06:56:14.978133
self = <tests.test_e2e_40_sdntrace.TestE2ESDNTrace object at 0x7fe282275a10>

    def test_020_run_sdntrace_fail_missing_flow(self):
        """Run SDNTrace-CP with a failure due to missing flows:
        - delete flow from intermediate switch
        - make sure sdntrace_cp detects the failure
        - make sure sdntrace detects the failure
        - redeploy evc and make sure sdntrace / sdntrace_cp works
        """
        # 1. delete flow
        delete_flow = {
            "flows": [
                {
                    'cookie': int("0xaa%s" % self.circuit['id'], 16),
                    'cookie_mask': 0xffffffffffffffff,
                }
            ]
        }

        api_url = KYTOS_API + '/kytos/flow_manager/v2/flows/00:00:00:00:00:00:00:05'
        response = requests.delete(api_url, json=delete_flow)
        assert response.status_code == 202, response.text
        time.sleep(10)

        # 2. sdntrace control plane - Trace from UNI_A
        payload_1 = {
            "trace": {
                "switch": {"dpid": "00:00:00:00:00:00:00:01", "in_port": 1},
                "eth": {"dl_type": 33024, "dl_vlan": 400}
            }
        }
        api_url = KYTOS_API + '/amlight/sdntrace_cp/v1/trace'
        response = requests.put(api_url, json=payload_1)
        data = response.json()
        # only 4 steps are expected: starting, 1->2, 2->3, 3->4
        assert len(data["result"]) == 4, str(data)

        full_path = [
            (
                l['endpoint_b']['switch'],
                l['endpoint_b']['port_number'],
                l['metadata']['s_vlan']['value']
            )
            for l in self.circuit['current_path']
        ]

        actual = [
            (step['dpid'], step['port'], step['vlan'])
            for step in data["result"][1:]
        ]

        assert full_path != actual, f"Full path {full_path}. Actual: {actual}"
        assert full_path[:3] == actual, f"Expected {full_path[:3]}. Actual: {actual}"

        # 3. sdntrace data plane - Trace from UNI_A
        payload_2 = {
            "trace": {
                "switch": {
                    "dpid": "00:00:00:00:00:00:00:01",
                    "in_port": 1
                },
                "eth": {
                    "dl_vlan": 400,
                    "dl_vlan_pcp": 4,
                    "dl_type": 2048
                },
                "ip": {
                    "nw_src": "0.0.0.1",
                    "nw_dst": "0.0.0.2",
                    "nw_tos": 5,
                    "nw_proto": 17
                },
                "tp": {
                    "tp_src": 33948,
                    "tp_dst": 53
                }
            }
        }

        api_url = KYTOS_API + '/amlight/sdntrace/v1/trace'
        response = requests.put(api_url, json=payload_2)
        assert response.status_code == 200, response.text
        data = response.json()
        result = self.wait_sdntrace_result(data["result"]["trace_id"])

        full_path = [
            (
                l['endpoint_b']['switch'],
                l['endpoint_b']['port_number'],
            )
            for l in self.circuit['current_path']
        ]

        actual = [
            (step['dpid'], step['port']) for step in result[1:-1]
        ]

        assert full_path != actual, f"Full path {full_path}. Actual: {actual}"
        assert full_path[:4] == actual, f"Expected {full_path[:4]}. Actual: {actual}"

        # 4. redeploy evc and check again
        circuit_id = self.circuit['id']
        api_url = KYTOS_API + '/kytos/mef_eline/v2/evc'
        response = requests.patch(f"{api_url}/{circuit_id}/redeploy")
        assert response.status_code == 202, response.text
        time.sleep(10)
        self.circuit = self.wait_until_evc_is_active(circuit_id)

        api_url = KYTOS_API + '/amlight/sdntrace_cp/v1/trace'
        response = requests.put(api_url, json=payload_1)
        data = response.json()
        assert len(data["result"]) == 10, data
        expected = [
            (
                l['endpoint_b']['switch'],
                l['endpoint_b']['port_number'],
                l['metadata']['s_vlan']['value']
            )
            for l in self.circuit['current_path']
        ]
        actual = [
            (step['dpid'], step['port'], step['vlan'])
            for step in data["result"][1:]
        ]
        assert expected == actual, f"Expected {expected}. Actual: {actual}"

        api_url = KYTOS_API + '/amlight/sdntrace/v1/trace'
        response = requests.put(api_url, json=payload_2)
        assert response.status_code == 200, response.text
        data = response.json()
>       result = self.wait_sdntrace_result(data["result"]["trace_id"])

tests/test_e2e_40_sdntrace.py:386:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.test_e2e_40_sdntrace.TestE2ESDNTrace object at 0x7fe282275a10>
trace_id = 30002, timeout = 10

    def wait_sdntrace_result(self, trace_id, timeout=10):
        """Wait until sdntrace finishes."""
        wait_count = 0
        while wait_count < timeout:
            try:
                api_url = KYTOS_API + '/amlight/sdntrace/v1/trace'
                response = requests.get(f"{api_url}/{trace_id}")
                data = response.json()
                assert data["result"][-1]["reason"] == "done"
                break
            except:
                time.sleep(1)
                wait_count += 1
        else:
            msg = 'Timeout while waiting from sdntrace result.'
>           raise Exception(msg)
E           Exception: Timeout while waiting from sdntrace result.

tests/test_e2e_40_sdntrace.py:159: Exception
=========================== rerun test summary info ============================
RERUN tests/test_e2e_40_sdntrace.py::TestE2ESDNTrace::test_020_run_sdntrace_fail_missing_flow
jab1982 commented 4 days ago

@Alopalao , can you please take a look?