Commit e7c5c315 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Tests - ACL End-to-end integration test:

- Updated test scripts and code
- Updated CI/CD descriptor
- Added CI/CD test to pipeline
parent c3d8c70b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ include:
  #- local: '/src/tests/ofc25/.gitlab-ci.yml'
  #- local: '/src/tests/ryu-openflow/.gitlab-ci.yml'
  - local: '/src/tests/qkd_end2end/.gitlab-ci.yml'
  - local: '/src/tests/acl_end2end/.gitlab-ci.yml'

  - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml'
  - local: '/src/tests/tools/mock_qkd_node/.gitlab-ci.yml'
+62 −20
Original line number Diff line number Diff line
@@ -188,32 +188,74 @@ end2end_test acl_end2end:
      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
      $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-onboarding.sh

    # Run end-to-end test: configure ACLs
    # Baseline connectivity: both clients can reach the DC
    - |
      export BASE_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.1.10' --format json)
      echo "${BASE_CLIENT1_DC}"
      echo "${BASE_CLIENT1_DC}" | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - |
      export BASE_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.1.10' --format json)
      echo "${BASE_CLIENT2_DC}"
      echo "${BASE_CLIENT2_DC}" | grep -E '3 packets transmitted, 3 received, 0\% packet loss'

    # Run end-to-end test: test connectivity with ping before creating ACL
    - export TEST_CLIENT1_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.11.1' --format json)
    - echo $TEST_CLIENT1_FW
    - echo $TEST_CLIENT1_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.10.10' --format json)
    - echo $TEST_CLIENT1_DC
    - echo $TEST_CLIENT1_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss'

    - export TEST_CLIENT2_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.12.1' --format json)
    - echo $TEST_CLIENT2_FW
    - echo $TEST_CLIENT2_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.10.10' --format json)
    - echo $TEST_CLIENT2_DC
    - echo $TEST_CLIENT2_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss'

    # Run end-to-end test: create ACLs
    - >
      docker run -t --rm --name ${TEST_NAME} --network=host
      --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh"
      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
      $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-acl-create-tests.sh

    # Run end-to-end test: test connectivity with ping after creating ACL
    - export TEST_CLIENT1_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.11.1' --format json)
    - echo $TEST_CLIENT1_FW
    - echo $TEST_CLIENT1_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.10.10' --format json)
    - echo $TEST_CLIENT1_DC
    - echo $TEST_CLIENT1_DC | grep -E '3 packets transmitted, 0 received, 100\% packet loss'

    - export TEST_CLIENT2_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.12.1' --format json)
    - echo $TEST_CLIENT2_FW
    - echo $TEST_CLIENT2_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.10.10' --format json)
    - echo $TEST_CLIENT2_DC
    - echo $TEST_CLIENT2_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss'

    # Run end-to-end test: delete ACLs
    - >
      docker run -t --rm --name ${TEST_NAME} --network=host
      --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh"
      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
      $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-acl-tests.sh

    # Run end-to-end test: test connectivity with ping
    - export TEST_CLIENT_FIREWALL=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.1.1' --format json)
    - echo $TEST_CLIENT_FIREWALL
    - echo $TEST_CLIENT_FIREWALL | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.0.10' --format json)
    - echo $TEST_CLIENT_DC
    - echo $TEST_CLIENT_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT2_FIREWALL=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.2.1' --format json)
    - echo $TEST_CLIENT2_FIREWALL
    - echo $TEST_CLIENT2_FIREWALL | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.0.10' --format json)
      $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-acl-delete-tests.sh

    # Run end-to-end test: test connectivity with ping after deleting ACL
    - export TEST_CLIENT1_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.11.1' --format json)
    - echo $TEST_CLIENT1_FW
    - echo $TEST_CLIENT1_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.10.10' --format json)
    - echo $TEST_CLIENT1_DC
    - echo $TEST_CLIENT1_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss'

    - export TEST_CLIENT2_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.12.1' --format json)
    - echo $TEST_CLIENT2_FW
    - echo $TEST_CLIENT2_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.10.10' --format json)
    - echo $TEST_CLIENT2_DC
    - echo $TEST_CLIENT2_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_DC_CLIENT=$(containerlab exec --name acl_end2end --label clab-node-name=dc --cmd 'ping -n -c3 172.16.1.10' --format json)
    - echo $TEST_DC_CLIENT
    - echo $TEST_DC_CLIENT | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
    - export TEST_DC_CLIENT2=$(containerlab exec --name acl_end2end --label clab-node-name=dc --cmd 'ping -n -c3 172.16.2.10' --format json)
    - echo $TEST_DC_CLIENT2
    - echo $TEST_DC_CLIENT2 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'

    # Run end-to-end test: cleanup scenario
    - >
+2 −3
Original line number Diff line number Diff line
#!/bin/bash
# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,5 +15,5 @@
source /var/teraflow/tfs_runtime_env_vars.sh
export PYTHONPATH=/var/teraflow
pytest --verbose --log-level=INFO \
    --junitxml=/opt/results/report_acl.xml \
    /var/teraflow/tests/acl_end2end/tests/test_acl.py
    --junitxml=/opt/results/report_acl_create.xml \
    /var/teraflow/tests/acl_end2end/tests/test_acl_create.py
+19 −0
Original line number Diff line number Diff line
# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

source /var/teraflow/tfs_runtime_env_vars.sh
export PYTHONPATH=/var/teraflow
pytest --verbose --log-level=INFO \
    --junitxml=/opt/results/report_acl_delete.xml \
    /var/teraflow/tests/acl_end2end/tests/test_acl_delete.py
+49 −0
Original line number Diff line number Diff line
# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import json, logging, os
from typing import Dict
from .Tools import do_rest_get_request, do_rest_post_request

LOGGER = logging.getLogger(__name__)
LOGGER.setLevel(logging.DEBUG)

ACL_URL = '/restconf/data/device=firewall/ietf-access-control-list:acls'
ACL_GET_URL_TEMPLATE = '/restconf/data/device=firewall/ietf-access-control-list:acl={acl_name}'
ACL_FILE = os.path.join(
    os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-acl.json'
)


def load_acl_payload() -> Dict:
    with open(ACL_FILE, 'r', encoding='UTF-8') as f:
        return json.load(f)

def get_acl_name(payload: Dict) -> str:
    return payload['ietf-access-control-list:acls']['acl'][0]['name']


def test_ietf_acl_create() -> None:
    acl_payload = load_acl_payload()
    acl_name = get_acl_name(acl_payload)

    do_rest_post_request(
        ACL_URL, body=acl_payload, logger=LOGGER,
        expected_status_codes={201, 204}
    )
    response = do_rest_get_request(
        ACL_GET_URL_TEMPLATE.format(acl_name=acl_name), logger=LOGGER,
        expected_status_codes={200}
    )
    assert response is not None
Loading