Commit 4e58d61a authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

End-to-end Test - Ryu-OpenFlow:

- Code polishing in Mininet topology
- Arranged CI/CD test descriptor
parent a83b4364
Loading
Loading
Loading
Loading
+244 −152
Original line number Diff line number Diff line
@@ -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"
@@ -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}"
@@ -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"
@@ -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
@@ -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:
+9 −4
Original line number Diff line number Diff line
@@ -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):
@@ -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()