Loading src/tests/ryu-openflow/.gitlab-ci.yml +244 −152 Original line number Diff line number Diff line Loading @@ -22,93 +22,178 @@ build ryu-openflow: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f script: # Build Ryu container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" # Build Mininet container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/mininet/Mininet.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" # Build test container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Test.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" after_script: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi - docker image prune --force rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' ###- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto - src/tests/${TEST_NAME}/**/*.{py,in,sh,yml} #- src/tests/${TEST_NAME}/Dockerfile - src/tests/${TEST_NAME}/*.Dockerfile - .gitlab-ci.yml # - docker rm -f na-t1 na-t2 na-r1 na-r2 # - docker network rm -f na-br # # - > # docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 # --ip-range=172.254.253.0/24 na-br # - > # docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 # --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" # --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" # asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh # Deploy TeraFlowSDN and Execute end-2-end test end2end_test ryu-openflow: timeout: 90m timeout: 45m variables: TEST_NAME: 'ryu-openflow' IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' stage: end2end_test # Disable to force running it after all other tasks needs: - build ryu-openflow #needs: # - build ryu-openflow before_script: # Cleanup old ContainerLab scenarios - containerlab destroy --all --cleanup || true # Do Docker cleanup - docker ps --all --quiet | xargs --no-run-if-empty docker stop - docker container prune --force - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force - docker image prune --force - docker network prune --force - docker volume prune --all --force - docker buildx prune --force # Check MicroK8s is ready - microk8s status --wait-ready - LOOP_MAX_ATTEMPTS=10 - LOOP_COUNTER=0 - > while ! kubectl get pods --all-namespaces &> /dev/null; do printf "%c" "." sleep 1 LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." exit 1 fi done - kubectl get pods --all-namespaces # Always delete Kubernetes namespaces - export K8S_NAMESPACES=$(kubectl get namespace -o jsonpath='{.items[*].metadata.name}') - echo "K8S_NAMESPACES=${K8S_NAMESPACES}" - export OLD_NATS_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^nats') - echo "OLD_NATS_NAMESPACES=${OLD_NATS_NAMESPACES}" - > for ns in ${OLD_NATS_NAMESPACES}; do if [[ "$ns" == nats* ]]; then if helm3 status "$ns" &>/dev/null; then helm3 uninstall "$ns" -n "$ns" else echo "Release '$ns' not found, skipping..." fi fi done - export OLD_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^(tfs|crdb|qdb|kafka|nats)') - echo "OLD_NAMESPACES=${OLD_NAMESPACES}" - kubectl delete namespace ${OLD_NAMESPACES} || true # Clean-up Kubernetes Failed pods - > kubectl get pods --all-namespaces --no-headers --field-selector=status.phase=Failed -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | xargs --no-run-if-empty --max-args=2 kubectl delete pod --namespace # Login Docker repository - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f # cleanup mininet #- docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c script: - echo "Starting script section" ## Download Docker images to run the test # Download Docker images to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" ## Check MicroK8s is ready # Check MicroK8s is ready - microk8s status --wait-ready - LOOP_MAX_ATTEMPTS=10 - LOOP_COUNTER=0 - > while ! kubectl get pods --all-namespaces &> /dev/null; do printf "%c" "." sleep 1 LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." exit 1 fi done - kubectl get pods --all-namespaces ##run ryu and mininet - docker rm -f ryu mininet || true - docker network rm tfs-test-ryu || true ###- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" # Deploy Docker network - > docker network create -d bridge --subnet=172.254.252.0/24 --gateway=172.254.252.254 --ip-range=172.254.252.0/24 ryu-of-br # Deploy Ryu - > docker run --detach --name ryu --network ryu-of-br --ip 172.254.252.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" # Wait for Ryu to get initialized - sleep 3 - docker logs ryu - docker ps -a - | - docker logs ryu - LOOP_MAX_ATTEMPTS=180 - LOOP_COUNTER=0 - > echo "Waiting for Ryu to be ready..." until curl http://172.20.0.10:8080/; do echo "Still waiting..." sleep 5 until curl --quiet http://172.254.252.10:8080/; do echo "Attempt: $LOOP_COUNTER" sleep 5; LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." break fi done echo "Ryu is ready!" # Deploy Mininet - > docker run --detach --name mininet --network ryu-of-br --ip 172.254.252.11 --privileged --volume /lib/modules:/lib/modules "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 --volume /lib/modules:/lib/modules "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" ## Wait for initialization of Device NOSes # Wait for initialization of Mininet - sleep 10 - docker ps -a - docker inspect mininet - docker logs ryu - docker logs mininet - echo "Finishing script section" # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) - docker exec mininet bash -c "ovs-vsctl show" - LOOP_MAX_ATTEMPTS=180 - LOOP_COUNTER=0 - > echo "Waiting for Mininet to be ready..." while ! docker logs mininet 2>&1 | grep -q 'Enabling remote OVSDB managers'; do echo "Attempt: $LOOP_COUNTER" docker logs mininet 2>&1; sleep 1; LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." break fi done echo "Mininet is ready!" - docker logs mininet # Dump configuration of the switches (OpenFlow rules configured) (after starting Mininet) - docker exec mininet bash -c "ovs-vsctl show" - docker exec mininet bash -c "ovs-ofctl dump-flows s1" - docker exec mininet bash -c "ovs-ofctl dump-flows s2" - docker exec mininet bash -c "ovs-ofctl dump-flows s3" Loading @@ -116,13 +201,12 @@ end2end_test ryu-openflow: - docker exec mininet bash -c "ovs-ofctl dump-flows s5" # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components # Uncomment if DEBUG log level is needed for the components #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml - source src/tests/${TEST_NAME}/deploy_specs.sh #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" Loading @@ -134,31 +218,30 @@ end2end_test ryu-openflow: - ./deploy/crdb.sh - ./deploy/nats.sh - ./deploy/kafka.sh - ./deploy/qdb.sh #- ./deploy/qdb.sh - ./deploy/tfs.sh - ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). # ## Investigate if we can use a counter to limit the number of iterations. # ## For now, keep it commented out. # #- LOOP_MAX_ATTEMPTS=180 # #- LOOP_COUNTER=0 # #- > # # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do # # echo "Attempt: $LOOP_COUNTER" # # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; # # sleep 1; # # LOOP_COUNTER=$((LOOP_COUNTER + 1)) # # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then # # echo "Max attempts reached, exiting the loop." # # break # # fi # # done - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Wait for Context to be subscribed to NATS ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). ## Investigate if we can use a counter to limit the number of iterations. ## For now, keep it commented out. #- LOOP_MAX_ATTEMPTS=180 #- LOOP_COUNTER=0 #- > # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do # echo "Attempt: $LOOP_COUNTER" # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; # sleep 1; # LOOP_COUNTER=$((LOOP_COUNTER + 1)) # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then # echo "Max attempts reached, exiting the loop." # break # fi # done #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Run end-to-end test: onboard scenario # Run end-to-end test: onboard scenario - > docker run -t --rm --name ${TEST_NAME} --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" Loading @@ -166,22 +249,28 @@ end2end_test ryu-openflow: "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-onboarding.sh # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 ## Run end-to-end test: configure service IETF #- > # 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}:${IMAGE_TAG} /var/teraflow/run-service-ietf-create.sh # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF service) - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # Run end-to-end test: configure service IETF - > 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-service-ietf-create.sh # # # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF service) # ## Run end-to-end test: test connectivity with ping #- export TEST1_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) #- echo $TEST1_10 Loading @@ -201,51 +290,54 @@ end2end_test ryu-openflow: #- export TEST3_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) #- echo $TEST3_10 #- echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' # ## Run end-to-end test: deconfigure service IETF #- > # 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-service-ietf-remove.sh # # # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF service) # # # Run end-to-end test: cleanup scenario # - > # 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-cleanup.sh # # after_script: # # Dump configuration of the switches (OpenFlow rules configured) (on after_script) # # # Dump TeraFlowSDN component logs # - source src/tests/${TEST_NAME}/deploy_specs.sh # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server # #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/monitoringservice -c server # # # Destroy Scenario # - docker rm -f ${TEST_NAME} || true # - RUNNER_PATH=`pwd` # #- cd $PWD/src/tests/${TEST_NAME} # - cd /tmp/clab/${TEST_NAME} # - containerlab destroy --topo ryu-openflow.clab.yml --cleanup || true # - sudo rm -rf clab-ryu-openflow/ .ryu-openflow.clab.yml.bak || true # destroy ryu # destroy mininet # - cd $RUNNER_PATH # - kubectl delete namespaces tfs || true # Clean old docker images - docker images --filter="dangling=true" --quiet | xargs -r docker rmi # ${CI_REGISTRY_IMAGE}/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-service-ietf-remove.sh # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF service) - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # Run end-to-end test: cleanup scenario - > 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}:${IMAGE_TAG} /var/teraflow/run-cleanup.sh after_script: # Dump configuration of the switches (OpenFlow rules configured) (on after_script) - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server # Clean up - kubectl delete namespaces tfs || true - docker ps --all --quiet | xargs --no-run-if-empty docker stop - docker container prune --force - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force - docker network prune --force - docker volume prune --all --force - docker image prune --force #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' rules: Loading src/tests/ryu-openflow/mininet/custom_pentagon_topology.py +9 −4 Original line number Diff line number Diff line Loading @@ -13,12 +13,12 @@ # limitations under the License. import time from mininet.topo import Topo from mininet.net import Mininet from mininet.node import RemoteController from mininet.cli import CLI from mininet.link import TCLink import time class PentagonTopo(Topo): def build(self): Loading Loading @@ -46,7 +46,12 @@ class PentagonTopo(Topo): if __name__ == '__main__': topo = PentagonTopo() net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='172.20.0.10', port=6653), link=TCLink) ctrl = RemoteController('ryu', ip='172.254.252.10', port=6653) net = Mininet( topo=topo, controller=ctrl, link=TCLink ) net.start() net.staticArp() Loading Loading
src/tests/ryu-openflow/.gitlab-ci.yml +244 −152 Original line number Diff line number Diff line Loading @@ -22,93 +22,178 @@ build ryu-openflow: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f script: # Build Ryu container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" # Build Mininet container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/mininet/Mininet.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" # Build test container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Test.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" after_script: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi - docker image prune --force rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' ###- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto - src/tests/${TEST_NAME}/**/*.{py,in,sh,yml} #- src/tests/${TEST_NAME}/Dockerfile - src/tests/${TEST_NAME}/*.Dockerfile - .gitlab-ci.yml # - docker rm -f na-t1 na-t2 na-r1 na-r2 # - docker network rm -f na-br # # - > # docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 # --ip-range=172.254.253.0/24 na-br # - > # docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 # --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" # --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" # asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh # Deploy TeraFlowSDN and Execute end-2-end test end2end_test ryu-openflow: timeout: 90m timeout: 45m variables: TEST_NAME: 'ryu-openflow' IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' stage: end2end_test # Disable to force running it after all other tasks needs: - build ryu-openflow #needs: # - build ryu-openflow before_script: # Cleanup old ContainerLab scenarios - containerlab destroy --all --cleanup || true # Do Docker cleanup - docker ps --all --quiet | xargs --no-run-if-empty docker stop - docker container prune --force - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force - docker image prune --force - docker network prune --force - docker volume prune --all --force - docker buildx prune --force # Check MicroK8s is ready - microk8s status --wait-ready - LOOP_MAX_ATTEMPTS=10 - LOOP_COUNTER=0 - > while ! kubectl get pods --all-namespaces &> /dev/null; do printf "%c" "." sleep 1 LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." exit 1 fi done - kubectl get pods --all-namespaces # Always delete Kubernetes namespaces - export K8S_NAMESPACES=$(kubectl get namespace -o jsonpath='{.items[*].metadata.name}') - echo "K8S_NAMESPACES=${K8S_NAMESPACES}" - export OLD_NATS_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^nats') - echo "OLD_NATS_NAMESPACES=${OLD_NATS_NAMESPACES}" - > for ns in ${OLD_NATS_NAMESPACES}; do if [[ "$ns" == nats* ]]; then if helm3 status "$ns" &>/dev/null; then helm3 uninstall "$ns" -n "$ns" else echo "Release '$ns' not found, skipping..." fi fi done - export OLD_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^(tfs|crdb|qdb|kafka|nats)') - echo "OLD_NAMESPACES=${OLD_NAMESPACES}" - kubectl delete namespace ${OLD_NAMESPACES} || true # Clean-up Kubernetes Failed pods - > kubectl get pods --all-namespaces --no-headers --field-selector=status.phase=Failed -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | xargs --no-run-if-empty --max-args=2 kubectl delete pod --namespace # Login Docker repository - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f # cleanup mininet #- docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c script: - echo "Starting script section" ## Download Docker images to run the test # Download Docker images to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" ## Check MicroK8s is ready # Check MicroK8s is ready - microk8s status --wait-ready - LOOP_MAX_ATTEMPTS=10 - LOOP_COUNTER=0 - > while ! kubectl get pods --all-namespaces &> /dev/null; do printf "%c" "." sleep 1 LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." exit 1 fi done - kubectl get pods --all-namespaces ##run ryu and mininet - docker rm -f ryu mininet || true - docker network rm tfs-test-ryu || true ###- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" # Deploy Docker network - > docker network create -d bridge --subnet=172.254.252.0/24 --gateway=172.254.252.254 --ip-range=172.254.252.0/24 ryu-of-br # Deploy Ryu - > docker run --detach --name ryu --network ryu-of-br --ip 172.254.252.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" # Wait for Ryu to get initialized - sleep 3 - docker logs ryu - docker ps -a - | - docker logs ryu - LOOP_MAX_ATTEMPTS=180 - LOOP_COUNTER=0 - > echo "Waiting for Ryu to be ready..." until curl http://172.20.0.10:8080/; do echo "Still waiting..." sleep 5 until curl --quiet http://172.254.252.10:8080/; do echo "Attempt: $LOOP_COUNTER" sleep 5; LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." break fi done echo "Ryu is ready!" # Deploy Mininet - > docker run --detach --name mininet --network ryu-of-br --ip 172.254.252.11 --privileged --volume /lib/modules:/lib/modules "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 --volume /lib/modules:/lib/modules "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" ## Wait for initialization of Device NOSes # Wait for initialization of Mininet - sleep 10 - docker ps -a - docker inspect mininet - docker logs ryu - docker logs mininet - echo "Finishing script section" # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) - docker exec mininet bash -c "ovs-vsctl show" - LOOP_MAX_ATTEMPTS=180 - LOOP_COUNTER=0 - > echo "Waiting for Mininet to be ready..." while ! docker logs mininet 2>&1 | grep -q 'Enabling remote OVSDB managers'; do echo "Attempt: $LOOP_COUNTER" docker logs mininet 2>&1; sleep 1; LOOP_COUNTER=$((LOOP_COUNTER + 1)) if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then echo "Max attempts reached, exiting the loop." break fi done echo "Mininet is ready!" - docker logs mininet # Dump configuration of the switches (OpenFlow rules configured) (after starting Mininet) - docker exec mininet bash -c "ovs-vsctl show" - docker exec mininet bash -c "ovs-ofctl dump-flows s1" - docker exec mininet bash -c "ovs-ofctl dump-flows s2" - docker exec mininet bash -c "ovs-ofctl dump-flows s3" Loading @@ -116,13 +201,12 @@ end2end_test ryu-openflow: - docker exec mininet bash -c "ovs-ofctl dump-flows s5" # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components # Uncomment if DEBUG log level is needed for the components #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml - source src/tests/${TEST_NAME}/deploy_specs.sh #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" Loading @@ -134,31 +218,30 @@ end2end_test ryu-openflow: - ./deploy/crdb.sh - ./deploy/nats.sh - ./deploy/kafka.sh - ./deploy/qdb.sh #- ./deploy/qdb.sh - ./deploy/tfs.sh - ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). # ## Investigate if we can use a counter to limit the number of iterations. # ## For now, keep it commented out. # #- LOOP_MAX_ATTEMPTS=180 # #- LOOP_COUNTER=0 # #- > # # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do # # echo "Attempt: $LOOP_COUNTER" # # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; # # sleep 1; # # LOOP_COUNTER=$((LOOP_COUNTER + 1)) # # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then # # echo "Max attempts reached, exiting the loop." # # break # # fi # # done - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Wait for Context to be subscribed to NATS ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). ## Investigate if we can use a counter to limit the number of iterations. ## For now, keep it commented out. #- LOOP_MAX_ATTEMPTS=180 #- LOOP_COUNTER=0 #- > # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do # echo "Attempt: $LOOP_COUNTER" # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; # sleep 1; # LOOP_COUNTER=$((LOOP_COUNTER + 1)) # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then # echo "Max attempts reached, exiting the loop." # break # fi # done #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Run end-to-end test: onboard scenario # Run end-to-end test: onboard scenario - > docker run -t --rm --name ${TEST_NAME} --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" Loading @@ -166,22 +249,28 @@ end2end_test ryu-openflow: "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-onboarding.sh # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 ## Run end-to-end test: configure service IETF #- > # 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}:${IMAGE_TAG} /var/teraflow/run-service-ietf-create.sh # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF service) - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # Run end-to-end test: configure service IETF - > 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-service-ietf-create.sh # # # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF service) # ## Run end-to-end test: test connectivity with ping #- export TEST1_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) #- echo $TEST1_10 Loading @@ -201,51 +290,54 @@ end2end_test ryu-openflow: #- export TEST3_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) #- echo $TEST3_10 #- echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' # ## Run end-to-end test: deconfigure service IETF #- > # 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-service-ietf-remove.sh # # # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF service) # # # Run end-to-end test: cleanup scenario # - > # 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-cleanup.sh # # after_script: # # Dump configuration of the switches (OpenFlow rules configured) (on after_script) # # # Dump TeraFlowSDN component logs # - source src/tests/${TEST_NAME}/deploy_specs.sh # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server # - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server # #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/monitoringservice -c server # # # Destroy Scenario # - docker rm -f ${TEST_NAME} || true # - RUNNER_PATH=`pwd` # #- cd $PWD/src/tests/${TEST_NAME} # - cd /tmp/clab/${TEST_NAME} # - containerlab destroy --topo ryu-openflow.clab.yml --cleanup || true # - sudo rm -rf clab-ryu-openflow/ .ryu-openflow.clab.yml.bak || true # destroy ryu # destroy mininet # - cd $RUNNER_PATH # - kubectl delete namespaces tfs || true # Clean old docker images - docker images --filter="dangling=true" --quiet | xargs -r docker rmi # ${CI_REGISTRY_IMAGE}/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-service-ietf-remove.sh # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF service) - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # Run end-to-end test: cleanup scenario - > 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}:${IMAGE_TAG} /var/teraflow/run-cleanup.sh after_script: # Dump configuration of the switches (OpenFlow rules configured) (on after_script) - docker exec mininet bash -c "ovs-vsctl show" - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server # Clean up - kubectl delete namespaces tfs || true - docker ps --all --quiet | xargs --no-run-if-empty docker stop - docker container prune --force - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force - docker network prune --force - docker volume prune --all --force - docker image prune --force #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' rules: Loading
src/tests/ryu-openflow/mininet/custom_pentagon_topology.py +9 −4 Original line number Diff line number Diff line Loading @@ -13,12 +13,12 @@ # limitations under the License. import time from mininet.topo import Topo from mininet.net import Mininet from mininet.node import RemoteController from mininet.cli import CLI from mininet.link import TCLink import time class PentagonTopo(Topo): def build(self): Loading Loading @@ -46,7 +46,12 @@ class PentagonTopo(Topo): if __name__ == '__main__': topo = PentagonTopo() net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='172.20.0.10', port=6653), link=TCLink) ctrl = RemoteController('ryu', ip='172.254.252.10', port=6653) net = Mininet( topo=topo, controller=ctrl, link=TCLink ) net.start() net.staticArp() Loading