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

Merge branch 'feat/292-cttc-implement-integration-test-for-ryu-openflow' into 'develop'

Resolve "(CTTC) Implement integration test for Ryu OpenFlow"

See merge request !361
parents 26a57404 5edd118e
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,12 @@ stages:
  - unit_test
  - unit_test
  - end2end_test
  - end2end_test


workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
      when: always
    - when: never

# include the individual .gitlab-ci.yml of each micro-service and tests
# include the individual .gitlab-ci.yml of each micro-service and tests
include:
include:
  #- local: '/manifests/.gitlab-ci.yml'
  #- local: '/manifests/.gitlab-ci.yml'
+18 −19
Original line number Original line Diff line number Diff line
@@ -143,19 +143,20 @@ class RyuApiClient:
        return result
        return result


    def add_flow_rule(
    def add_flow_rule(
        self, dpid : int, in_port : int, out_port : int,
        self, dpid : int, in_port : Optional[int], out_port : int,
        eth_type : int, ip_src_addr : str, ip_dst_addr : str,
        eth_type : Optional[int], ip_src_addr : Optional[str], ip_dst_addr : Optional[str],
        priority : int = 65535,
        priority : int = 65535,
    ) -> Union[bool, Exception]:
    ) -> Union[bool, Exception]:
        match = dict()
        if in_port     is not None: match['in_port' ] = in_port
        if eth_type    is not None: match['eth_type'] = eth_type
        if ip_src_addr is not None: match['ipv4_src'] = ip_src_addr
        if ip_dst_addr is not None: match['ipv4_dst'] = ip_dst_addr

        flow_entry = {
        flow_entry = {
            "dpid"    : dpid,
            "dpid"    : dpid,
            "priority": priority,
            "priority": priority,
            "match"   : {
            "match"   : match,
                "in_port" : in_port,
                "eth_type": eth_type,
                "ipv4_src": ip_src_addr,
                "ipv4_dst": ip_dst_addr,
            },
            "instructions": [
            "instructions": [
                {
                {
                    "type": "APPLY_ACTIONS",
                    "type": "APPLY_ACTIONS",
@@ -191,22 +192,20 @@ class RyuApiClient:




    def del_flow_rule(
    def del_flow_rule(
        self, dpid : int, in_port : int, out_port : int,
        self, dpid : int, in_port : Optional[int], out_port : int,
        eth_type : int, ip_src_addr : str, ip_dst_addr : str,
        eth_type : Optional[int], ip_src_addr : Optional[str], ip_dst_addr : Optional[str],
        priority : int = 65535,
        priority : int = 65535,
    ) -> Union[bool, Exception]:
    ) -> Union[bool, Exception]:
        match = dict(table_id=0, cookie=0, cookie_mask=0)
        if in_port     is not None: match['in_port' ] = in_port
        if eth_type    is not None: match['eth_type'] = eth_type
        if ip_src_addr is not None: match['ipv4_src'] = ip_src_addr
        if ip_dst_addr is not None: match['ipv4_dst'] = ip_dst_addr

        flow_entry = {
        flow_entry = {
            "dpid"    : dpid,
            "dpid"    : dpid,
            "priority": priority,
            "priority": priority,
            "match"   : {
            "match"   : match,
                "in_port" : in_port,
                "eth_type": eth_type,
                "ipv4_src": ip_src_addr,
                "ipv4_dst": ip_dst_addr,
                "table_id"   : 0,
                "cookie"     : 0,
                "cookie_mask": 0,
            },
            "instructions": [
            "instructions": [
                {
                {
                    "type": "APPLY_ACTIONS",
                    "type": "APPLY_ACTIONS",
+6 −6
Original line number Original line Diff line number Diff line
@@ -91,8 +91,8 @@ class RyuDriver(_Driver):
                        dpid = int(resource_value_dict["dpid"], 16)
                        dpid = int(resource_value_dict["dpid"], 16)
                        in_port = int(resource_value_dict["in-port"].split("-")[1][3:])
                        in_port = int(resource_value_dict["in-port"].split("-")[1][3:])
                        out_port = int(resource_value_dict["out-port"].split("-")[1][3:])
                        out_port = int(resource_value_dict["out-port"].split("-")[1][3:])
                        ip_src_addr = resource_value_dict.get("ip_address_source", "")
                        src_ip_addr = resource_value_dict.get("src-ip-addr", "")
                        ip_dst_addr = resource_value_dict.get("ip_address_destination", "")
                        dst_ip_addr = resource_value_dict.get("dst-ip-addr", "")


                        if "h1-h3" in resource_key:
                        if "h1-h3" in resource_key:
                            priority = 1000
                            priority = 1000
@@ -111,7 +111,7 @@ class RyuDriver(_Driver):
                        continue
                        continue


                    results.append(self.rac.add_flow_rule(
                    results.append(self.rac.add_flow_rule(
                        dpid, in_port, out_port, 0x0800, ip_src_addr, ip_dst_addr,
                        dpid, in_port, out_port, 0x0800, src_ip_addr, dst_ip_addr,
                        priority=priority
                        priority=priority
                    ))
                    ))
                except Exception as e:
                except Exception as e:
@@ -143,8 +143,8 @@ class RyuDriver(_Driver):
                        dpid = int(resource_value_dict["dpid"], 16)
                        dpid = int(resource_value_dict["dpid"], 16)
                        in_port = int(resource_value_dict["in-port"].split("-")[1][3:])
                        in_port = int(resource_value_dict["in-port"].split("-")[1][3:])
                        out_port = int(resource_value_dict["out-port"].split("-")[1][3:])
                        out_port = int(resource_value_dict["out-port"].split("-")[1][3:])
                        ip_src_addr = resource_value_dict.get("ip_address_source", "")
                        src_ip_addr = resource_value_dict.get("src-ip-addr", "")
                        ip_dst_addr = resource_value_dict.get("ip_address_destination", "")
                        dst_ip_addr = resource_value_dict.get("dst-ip-addr", "")


                        if "h1-h3" in resource_key:
                        if "h1-h3" in resource_key:
                            priority = 1000
                            priority = 1000
@@ -163,7 +163,7 @@ class RyuDriver(_Driver):
                        continue
                        continue


                    results.append(self.rac.del_flow_rule(
                    results.append(self.rac.del_flow_rule(
                        dpid, in_port, out_port, 0x0800, ip_src_addr, ip_dst_addr,
                        dpid, in_port, out_port, 0x0800, src_ip_addr, dst_ip_addr,
                        priority=priority
                        priority=priority
                    ))
                    ))
                except Exception as e:
                except Exception as e:
+1 −1
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@ DEVICE_TYPE_TO_DEEPNESS = {
    DeviceTypeEnum.IP_SDN_CONTROLLER.value               : 80,
    DeviceTypeEnum.IP_SDN_CONTROLLER.value               : 80,
    DeviceTypeEnum.IETF_SLICE.value                      : 80,
    DeviceTypeEnum.IETF_SLICE.value                      : 80,
    DeviceTypeEnum.NCE.value                             : 80,
    DeviceTypeEnum.NCE.value                             : 80,

    DeviceTypeEnum.OPENFLOW_RYU_CONTROLLER.value         : 80,


    DeviceTypeEnum.EMULATED_PACKET_ROUTER.value          : 70,
    DeviceTypeEnum.EMULATED_PACKET_ROUTER.value          : 70,
    DeviceTypeEnum.PACKET_POP.value                      : 70,
    DeviceTypeEnum.PACKET_POP.value                      : 70,
+10 −10
Original line number Original line Diff line number Diff line
@@ -24,10 +24,10 @@ build policy:
    - docker image prune --force
    - docker image prune --force
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
  script:
    - export IMAGE_TAG=$(grep -m1 '<version>' ./src/$IMAGE_NAME_POLICY/pom.xml | grep -oP  '(?<=>).*(?=<)')
    - export POL_IMAGE_TAG=$(grep -m1 '<version>' ./src/$IMAGE_NAME_POLICY/pom.xml | grep -oP  '(?<=>).*(?=<)')
    - echo "IMAGE_TAG=${IMAGE_TAG}" >> ${BUILD_ENV_POLICY}
    - echo "POL_IMAGE_TAG=${POL_IMAGE_TAG}" >> ${BUILD_ENV_POLICY}
    - cat ${BUILD_ENV_POLICY}
    - cat ${BUILD_ENV_POLICY}
    - docker buildx build -t "$IMAGE_NAME_POLICY:$IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target builder
    - docker buildx build -t "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target builder
  after_script:
  after_script:
    - docker image prune --force
    - docker image prune --force
  artifacts:
  artifacts:
@@ -52,10 +52,10 @@ unit_test policy:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker rm ${REPORTS_CONTAINER} || true
    - docker rm ${REPORTS_CONTAINER} || true
  script:
  script:
    - echo "Running tests for image ${IMAGE_TAG}"
    - echo "Running tests for image ${POL_IMAGE_TAG}"
    - docker buildx build -t "$IMAGE_NAME_POLICY:$IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target unit-test
    - docker buildx build -t "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target unit-test
    # Transfer JaCoCo and Surefire reports from within tests image
    # Transfer JaCoCo and Surefire reports from within tests image
    - docker create --name ${REPORTS_CONTAINER} "$IMAGE_NAME_POLICY:$IMAGE_TAG"
    - docker create --name ${REPORTS_CONTAINER} "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG"
    - mkdir -p ${REPORTS_PATH_POLICY}
    - mkdir -p ${REPORTS_PATH_POLICY}
    - docker cp ${REPORTS_CONTAINER}:/app/target/site/jacoco/index.html ${REPORTS_PATH_POLICY}/coverage.html
    - docker cp ${REPORTS_CONTAINER}:/app/target/site/jacoco/index.html ${REPORTS_PATH_POLICY}/coverage.html
    - docker cp ${REPORTS_CONTAINER}:/app/target/site/jacoco/jacoco.xml ${REPORTS_PATH_POLICY}/jacoco.xml
    - docker cp ${REPORTS_CONTAINER}:/app/target/site/jacoco/jacoco.xml ${REPORTS_PATH_POLICY}/jacoco.xml
@@ -63,12 +63,12 @@ unit_test policy:
    - cat ${REPORTS_PATH_POLICY}/coverage.html | grep -o 'Total[^%]*%' | sed 's/<.*>/ /; s/Total/JaCoCo Coverage Total:/'
    - cat ${REPORTS_PATH_POLICY}/coverage.html | grep -o 'Total[^%]*%' | sed 's/<.*>/ /; s/Total/JaCoCo Coverage Total:/'
    - docker run -v "$(pwd)/src/${IMAGE_NAME_POLICY}:/${IMAGE_NAME_POLICY}" --rm registry.gitlab.com/haynes/jacoco2cobertura:1.0.7 python /opt/cover2cover.py ${IMAGE_NAME_POLICY}/reports/jacoco.xml ${IMAGE_NAME_POLICY}/src/main/java > ${REPORTS_PATH_POLICY}/cobertura.xml
    - docker run -v "$(pwd)/src/${IMAGE_NAME_POLICY}:/${IMAGE_NAME_POLICY}" --rm registry.gitlab.com/haynes/jacoco2cobertura:1.0.7 python /opt/cover2cover.py ${IMAGE_NAME_POLICY}/reports/jacoco.xml ${IMAGE_NAME_POLICY}/src/main/java > ${REPORTS_PATH_POLICY}/cobertura.xml
    # Build final image
    # Build final image
    - docker buildx build -t "$IMAGE_NAME_POLICY:$IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target release
    - docker buildx build -t "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target release
    - docker tag "$IMAGE_NAME_POLICY:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$IMAGE_TAG"
    - docker tag "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$POL_IMAGE_TAG"
    - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$IMAGE_TAG"
    - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$POL_IMAGE_TAG"
  after_script:
  after_script:
    - docker rm ${REPORTS_CONTAINER}
    - docker rm ${REPORTS_CONTAINER}
    - docker rm -f "$IMAGE_NAME_POLICY:$IMAGE_TAG"
    - docker rm -f "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG"
  coverage: '/JaCoCo Coverage Total: ([0-9]{1,3})%/'
  coverage: '/JaCoCo Coverage Total: ([0-9]{1,3})%/'
  artifacts:
  artifacts:
    reports:
    reports:
Loading