diff --git a/.github/workflows/kind.yml b/.github/workflows/kind.yml index 168bf029b33..42a5b82012d 100644 --- a/.github/workflows/kind.yml +++ b/.github/workflows/kind.yml @@ -277,6 +277,67 @@ jobs: path: log.tar.gz retention-days: 30 + test-e2e-ipam-feature-enabled: + name: E2e tests on a Kind cluster on Linux with FlexibleIPAM feature enabled + needs: [build-antrea-coverage-image] + runs-on: [ubuntu-latest-4-cores] + steps: + - uses: actions/checkout@v4 + with: + show-progress: false + - uses: actions/setup-go@v5 + with: + go-version-file: 'go.mod' + - name: Download Antrea image from previous job + uses: actions/download-artifact@v4 + with: + name: antrea-ubuntu-cov + - name: Load Antrea image + run: | + docker load -i antrea-ubuntu.tar + - name: Install Kind + run: | + KIND_VERSION=$(head -n1 ./ci/kind/version) + curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-$(uname)-amd64 + chmod +x ./kind + sudo mv kind /usr/local/bin + - name: Run ipam e2e tests + run: | + mkdir log + mkdir test-ipam-e2e-coverage + ANTREA_LOG_DIR=$PWD/log ANTREA_COV_DIR=$PWD/test-ipam-e2e-coverage ./ci/kind/test-e2e-kind.sh \ + --encap-mode noEncap \ + --coverage \ + --flexible-ipam + - name: Tar coverage files + run: tar -czf test-ipam-e2e-coverage.tar.gz test-ipam-e2e-coverage + - name: Upload coverage for test-ipam-e2e-coverage + uses: actions/upload-artifact@v4 + with: + name: test-ipam-e2e-coverage + path: test-ipam-e2e-coverage.tar.gz + retention-days: 30 + - name: Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: '*.cov.out*' + disable_search: true + flags: kind-e2e-tests + name: test-ipam-e2e-coverage + directory: test-ipam-e2e-coverage + fail_ci_if_error: ${{ github.event_name == 'push' }} + - name: Tar log files + if: ${{ failure() }} + run: tar -czf log.tar.gz log + - name: Upload test log + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: e2e-kind-ipam-features-enabled.tar.gz + path: log.tar.gz + retention-days: 30 + test-e2e-noencap: name: E2e tests on a Kind cluster on Linux (noEncap) needs: [build-antrea-coverage-image] diff --git a/ci/kind/kind-setup.sh b/ci/kind/kind-setup.sh index e6f5f676130..d4fba9f4f9c 100755 --- a/ci/kind/kind-setup.sh +++ b/ci/kind/kind-setup.sh @@ -300,6 +300,19 @@ function configure_vlan_subnets { docker_run_with_host_net iptables -t filter -A FORWARD -i ${vlan_interfaces[j]} -o ${vlan_interfaces[i]} -j ACCEPT done done + + # Adding ipset rules to prevent SNAT based on flexibleIPAM e2e tests + if [[ $FLEXIBLE_IPAM == true ]]; then + docker_run_with_host_net ipset create excluded_subnets hash:net + docker_run_with_host_net ipset add excluded_subnets 192.168.241.0/24 + docker_run_with_host_net ipset add excluded_subnets 192.168.242.0/24 + docker_run_with_host_net ipset add excluded_subnets 192.168.240.0/24 + docker_run_with_host_net ipset list excluded_subnets + + docker_run_with_host_net iptables -t nat -I POSTROUTING 1 ! -o $bridge_interface -s 192.168.240.0/24 -m set ! --match-set excluded_subnets dst -j MASQUERADE + docker_run_with_host_net iptables -t nat -A POSTROUTING ! -o $bridge_interface -s 10.244.0.0/16 -m set ! --match-set excluded_subnets dst -j MASQUERADE + fi + } function delete_vlan_subnets { @@ -327,6 +340,13 @@ function delete_networks { docker network rm $networks > /dev/null 2>&1 echo "deleted networks $networks" fi + + if [[ $FLEXIBLE_IPAM == true ]]; then + networks=$(docker network ls -f name=kind --format '{{.Name}}') + networks="$(echo $networks)" + docker network rm $networks > /dev/null 2>&1 + echo "deleted networks $networks" + fi } function load_images { @@ -711,7 +731,6 @@ if [[ $ACTION == "destroy" ]]; then exit fi - kind_version=$(kind version | awk '{print $2}') kind_version=${kind_version:1} # strip leading 'v' function version_lt() { test "$(printf '%s\n' "$@" | sort -rV | head -n 1)" != "$1"; } @@ -728,5 +747,10 @@ if [[ $ACTION == "create" ]]; then echoerr "Only one of '--subnets' and '--extra-networks' can be specified" exit 1 fi + + # To run FlexibleIPAM e2e tests, kind network should be in 192.168.240.0/24 subnet. + if [[ $FLEXIBLE_IPAM == true ]]; then + docker network create -d bridge --subnet 192.168.240.0/24 kind + fi create fi diff --git a/ci/kind/test-e2e-kind.sh b/ci/kind/test-e2e-kind.sh index 5adc2a8352c..96344b8bd4e 100755 --- a/ci/kind/test-e2e-kind.sh +++ b/ci/kind/test-e2e-kind.sh @@ -89,6 +89,7 @@ setup_only=false cleanup_only=false test_only=false run="" +flexible_ipam=false antrea_controller_image="antrea/antrea-controller-ubuntu" antrea_agent_image="antrea/antrea-agent-ubuntu" use_non_default_images=false @@ -110,6 +111,10 @@ case $key in proxy_all=true shift ;; + --flexible-ipam) + flexible_ipam=true + shift + ;; --no-kube-proxy) no_kube_proxy=true shift @@ -249,6 +254,10 @@ if $flow_visibility; then manifest_args="$manifest_args --feature-gates FlowExporter=true,L7FlowExporter=true --extra-helm-values-file $FLOW_VISIBILITY_HELM_VALUES" fi +if $flexible_ipam; then + manifest_args="$manifest_args --flexible-ipam" +fi + COMMON_IMAGES_LIST=("registry.k8s.io/e2e-test-images/agnhost:2.40" \ "antrea/nginx:1.21.6-alpine" \ "antrea/toolbox:1.5-1") @@ -302,6 +311,10 @@ if $extra_vlan; then fi fi +if $flexible_ipam; then + vlan_args="$vlan_args --vlan-subnets 11=192.168.241.1/24 --vlan-subnets 12=192.168.242.1/24" +fi + function setup_cluster { args=$1 @@ -330,6 +343,10 @@ function setup_cluster { fi echo "creating test bed with args $args" + if $flexible_ipam; then + TESTBED_CMD="$TESTBED_CMD --flexible-ipam" + fi + eval "timeout 600 $TESTBED_CMD create kind $args" } @@ -353,6 +370,10 @@ function run_test { timeout="75m" fi + if $flexible_ipam; then + $YML_CMD --flexible-ipam --multicast --encap-mode $current_mode $manifest_args | docker exec -i kind-control-plane dd of=/root/antrea.yml + fi + if $flow_visibility; then timeout="30m" flow_visibility_args="-run=TestFlowAggregator --flow-visibility" @@ -401,6 +422,11 @@ function run_test { EXTRA_ARGS="$EXTRA_ARGS --external-frr-cid $external_frr_cid --external-frr-ips $external_frr_ips" fi + if $flexible_ipam; then + EXTRA_ARGS="$EXTRA_ARGS --antrea-ipam" + timeout="100m" + fi + go test -v -timeout=$timeout $RUN_OPT antrea.io/antrea/test/e2e $flow_visibility_args -provider=kind --logs-export-dir=$ANTREA_LOG_DIR $np_evaluation_flag --skip-cases=$skiplist $coverage_args $EXTRA_ARGS if $coverage; then