Skip to content

✨ Add support for prefer dual stack policy #5124

✨ Add support for prefer dual stack policy

✨ Add support for prefer dual stack policy #5124

Workflow file for this run

name: CI
on:
merge_group:
pull_request:
paths-ignore:
- 'configsamples/**'
- 'design/**'
- 'website/**'
- 'CODE_OF_CONDUCT.md'
- 'CODEOWNERS'
- 'CONTRIBUTING.md'
- 'DCO'
- 'LICENSE'
- 'netlify.toml'
- 'README.md'
branches:
- "main"
- "v**"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
static-security-analysis:
runs-on: ubuntu-22.04
env:
GO111MODULE: on
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Run Gosec Security Scanner
uses: securego/gosec@v2.21.2
with:
args: -exclude-dir e2etest -severity medium ./...
- name: Golang Vulncheck
uses: golang/govulncheck-action@v1.0.3
with:
go-version-file: go.mod
commitlint:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: wagoid/commitlint-github-action@v5
unit-tests:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: "go.mod"
cache: true
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install python3-pip arping ndisc6
sudo pip3 install -r dev-env/requirements.txt
- name: Unit Tests
run: |
inv test
- name: Lint
run: |
inv checkpatch
inv lint -e host
inv verifylicense
inv gomodtidy
inv checkchanges --action="run inv gomodtidy"
inv generatemanifests
inv checkchanges --action="run inv generatemanifests"
inv generateapidocs
inv checkchanges --action="run inv generateapidocs"
inv linttasks
inv checkchanges --action="run inv linttasks"
build-test-images:
runs-on: ubuntu-22.04
strategy:
fail-fast: true
matrix:
image: [speaker, controller, configmaptocrs]
steps:
- name: Code checkout
uses: actions/checkout@v4
- name: Setup docker buildx
uses: docker/setup-buildx-action@v3
- name: Build and export ${{ matrix.image }}
uses: docker/build-push-action@v5
with:
context: .
tags: quay.io/metallb/${{ matrix.image }}:dev-amd64
file: ${{matrix.image}}/Dockerfile
outputs: type=docker,dest=/tmp/${{ matrix.image }}.tar
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Upload ${{ matrix.image }} artifact
uses: actions/upload-artifact@v4
with:
retention-days: 1
name: image-tar-${{ matrix.image }}
path: /tmp/${{ matrix.image }}.tar
helm:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Required for chart-testing
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@v4
with:
version: v3.12.1
- uses: actions/setup-python@v5
with:
python-version: '3.10'
check-latest: true
- name: Set up chart-testing
uses: helm/chart-testing-action@v2.6.1
- name: Run chart-testing (list-changed)
id: list-changed
run: |
changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }})
if [[ -n "$changed" ]]; then
echo "changed=true" >> "$GITHUB_OUTPUT"
fi
- name: Run chart-testing (lint)
if: steps.list-changed.outputs.changed == 'true'
run: |
helm repo add frrk8s https://metallb.github.io/frr-k8s
ct lint --check-version-increment=false --validate-maintainers=false --target-branch ${{ github.event.repository.default_branch }}
- name: Check if deps are updated
run: |
helm repo add frrk8s https://metallb.github.io/frr-k8s
helm dependency update charts/metallb
if [[ $(git status --porcelain | wc -l) -gt 0 ]]; then
echo "Please update the helm dependencies with: helm dependency update charts/metallb"
exit 1
fi
- name: Helm doc generate
uses: docker://jnorwood/helm-docs:v1.10.0
- name: Check if docs are different
run: |
if [[ $(git status --porcelain | wc -l) -gt 0 ]]; then
echo "Please update the helm docs with the \"helm-docs\" command (https://github.com/norwoodj/helm-docs) or use \"inv helmdocs\""
exit 1
fi
## TODO: Can't pass flags to the conftest GHA in order to use --fail-on-warn
## Should be fixed when https://github.com/instrumenta/conftest-action/issues/3
## is resolved
##
# - name: Conftest
# uses: instrumenta/conftest-action/helm@master
# with:
# chart: charts/metallb/
# policy: charts/metallb/policy
- name: Conftest
run: |
helm plugin install --debug https://github.com/instrumenta/helm-conftest
helm conftest charts/metallb/ -p charts/metallb/policy/ --fail-on-warn
e2e:
runs-on: ubuntu-22.04
needs:
- unit-tests
- build-test-images
- helm
- commitlint
strategy:
fail-fast: false
matrix:
ip-family: [ipv4, ipv6, dual]
bgp-type: [native, frr, frr-k8s, frr-k8s-external]
deployment: [manifests, helm]
exclude:
- bgp-type: frr-k8s-external
ip-family: ipv4
- bgp-type: frr-k8s-external
ip-family: ipv6
- bgp-type: frr-k8s
ip-family: dual
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install kernel modules
run: |
sudo apt-get update
sudo apt-get install linux-modules-extra-$(uname -r)
- name: Setup
uses: ./.github/workflows/composite/setup
- name: Deploy MetalLB
run: |
HELM_FLAGS=""
PROMETHEUS_FLAGS="--with-prometheus"
if [ ${{ matrix.deployment }} = "helm" ]; then HELM_FLAGS="--helm-install"; fi
if [ ${{ matrix.bgp-type }} = "frr-k8s-external" ]; then PROMETHEUS_FLAGS=""; fi
inv dev-env -i ${{ matrix.ip-family }} -b ${{ matrix.bgp-type }} -l all $HELM_FLAGS --no-build-images $PROMETHEUS_FLAGS
- name: E2E
run: |
HELM_FLAGS=""
echo '/etc/frr/core-%e.%p.%h.%t' | sudo tee /proc/sys/kernel/core_pattern
if [ ${{ matrix.deployment }} = "helm" ]; then export SPEAKER_SELECTOR="app.kubernetes.io/component=speaker" && export CONTROLLER_SELECTOR="app.kubernetes.io/component=controller"; fi
# TODO restore to NONE when https://github.com/metallb/metallb/issues/2311 is fixed
SKIP="L2ServiceStatus"
WITH_VRF="--with-vrf"
FOCUS=""
if [ "${{ matrix.bgp-type }}" == "native" ]; then SKIP="$SKIP|FRR|FRR-MODE|FRRK8S-MODE|BFD|VRF|DUALSTACK"; WITH_VRF=""; fi
if [ "${{ matrix.ip-family }}" == "ipv4" ]; then SKIP="$SKIP|IPV6|DUALSTACK"; fi
if [ "${{ matrix.ip-family }}" == "dual" ]; then SKIP="$SKIP|IPV6"; fi
if [ "${{ matrix.ip-family }}" == "ipv6" ]; then SKIP="$SKIP|IPV4|DUALSTACK"; fi
if [ "${{ matrix.ip-family }}" == "ipv6" ] && [ ${{ matrix.bgp-type }} == "native" ]; then SKIP="$SKIP|BGP"; fi
if [ "${{ matrix.bgp-type }}" == "frr" ]; then SKIP="$SKIP|FRRK8S-MODE"; fi
if [ "${{ matrix.bgp-type }}" == "frr-k8s" ]; then SKIP="$SKIP|FRR-MODE"; fi
if [ "${{ matrix.bgp-type }}" == "frr-k8s-external" ]; then SKIP="$SKIP|FRR-MODE|metrics"; fi
echo "Skipping $SKIP"
echo "With VRF $WITH_VRF"
sudo -E env "PATH=$PATH" inv e2etest $FOCUS --skip $SKIP --bgp-mode ${{ matrix.bgp-type }} $WITH_VRF -e /tmp/kind_logs
- name: Collect Logs
if: ${{ failure() }}
uses: ./.github/workflows/composite/collectlogs
with:
artifact-name: kind-logs-${{ matrix.ip-family }}-${{ matrix.bgp-type }}-${{ matrix.deployment}}
- name: Publish JUnit Report
uses: mikepenz/action-junit-report@v4
if: success() || failure()
with:
annotate_only: true
report_paths: 'e2etest/junit-report.xml'
e2e-use-operator:
runs-on: ubuntu-22.04
needs:
- unit-tests
- build-test-images
- helm
- commitlint
defaults:
run:
shell: bash
steps:
- name: Install kernel modules
run: |
sudo apt-get update
sudo apt-get install linux-modules-extra-$(uname -r)
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup
uses: ./.github/workflows/composite/setup
- name: Checkout Metal LB Operator
uses: actions/checkout@v4
with:
repository: metallb/metallb-operator
path: metallboperator
ref: main
- name: Checkout MetalLB
uses: actions/checkout@v4
with:
path: metallb
fetch-depth: 0
- name: Create multi-node K8s Kind Cluster
run: |
cd ${GITHUB_WORKSPACE}/metallboperator
./hack/kind-multi-node-cluster-without-registry.sh
kind load docker-image quay.io/metallb/speaker:dev-amd64
kind load docker-image quay.io/metallb/controller:dev-amd64
export KUBECONFIG=${HOME}/.kube/config
- name: Deploy Metal LB Operator
run: |
cd ${GITHUB_WORKSPACE}/metallboperator
sed -i 's/quay.io\/metallb\/speaker:main/quay.io\/metallb\/speaker:dev-amd64/g' bin/metallb-operator.yaml
sed -i 's/quay.io\/metallb\/controller:main/quay.io\/metallb\/controller:dev-amd64/g' bin/metallb-operator.yaml
sed -i 's/native/frr/g' bin/metallb-operator.yaml
kubectl apply -f bin/metallb-operator.yaml
- name: Remove the exclude from external lb label from the master node
run: |
env "PATH=$PATH" inv remove-lb-exclusion-from-nodes
- name: Ensure MetalLB operator is ready
run: |
COUNT=0
while [ "$(kubectl get pods -n metallb-system -l control-plane='controller-manager' -o jsonpath='{.items[*].status.containerStatuses[0].ready}')" != "true" ]; do
sleep 5
COUNT=$((COUNT+1))
if [[ $COUNT -gt 15 ]] ; then
exit 1;
fi
echo "Waiting for operator pod to be ready."
done
- name: MetalLB E2E Tests with Operator Deployment
run: |
cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
name: metallb
namespace: metallb-system
spec:
logLevel: debug
EOF
# TOOD remove skipping L2ServiceStatus once https://github.com/metallb/metallb/issues/2311 is fixed
sudo -E env "PATH=$PATH" inv e2etest --bgp-mode frr --skip "IPV6|DUALSTACK|metrics|L2-interface selector|FRRK8S-MODE|L2ServiceStatus" -e /tmp/kind_logs
- name: Collect Logs
if: ${{ failure() }}
uses: ./.github/workflows/composite/collectlogs
with:
artifact-name: kind_logs_use_operator
- name: Publish JUnit Report
uses: mikepenz/action-junit-report@v4
if: success() || failure()
with:
annotate_only: true
report_paths: 'e2etest/junit-report.xml'
oldest_k8s:
runs-on: ubuntu-22.04
needs:
- unit-tests
- build-test-images
- helm
- commitlint
steps:
- name: Install kernel modules
run: |
sudo apt-get update
sudo apt-get install linux-modules-extra-$(uname -r)
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup
uses: ./.github/workflows/composite/setup
- name: Deploy MetalLB
run: |
inv dev-env -b frr --with-prometheus --no-build-images --node-img kindest/node:v1.27.1@sha256:b7d12ed662b873bd8510879c1846e87c7e676a79fefc93e17b2a52989d3ff42b
- name: E2E
run: |
FOCUS="L2.*should work for ExternalTrafficPolicy=Cluster|BGP.*A service of protocol load balancer should work with.*IPV4 - ExternalTrafficPolicyCluster$|validate FRR running configuration"
sudo -E env "PATH=$PATH" inv e2etest --bgp-mode frr --focus "$FOCUS" --skip L2ServiceStatus -e /tmp/kind_logs
- name: Collect Logs
if: ${{ failure() }}
uses: ./.github/workflows/composite/collectlogs
with:
artifact-name: kind-logs-oldest-k8s
- name: Publish JUnit Report
uses: mikepenz/action-junit-report@v4
if: success() || failure()
with:
annotate_only: true
report_paths: 'e2etest/junit-report.xml'