name: Helm tests concurrency: group: helm-${{ github.event_name }}-${{ github.ref }} cancel-in-progress: true on: workflow_call: inputs: version-emqx: required: true type: string version-emqx-enterprise: required: true type: string jobs: helm_test: runs-on: ubuntu-22.04 defaults: run: shell: bash env: EMQX_NAME: ${{ matrix.profile }} EMQX_TAG: ${{ matrix.profile == 'emqx-enterprise' && inputs.version-emqx-enterprise || inputs.version-emqx }} REPOSITORY: "emqx/${{ matrix.profile }}" strategy: fail-fast: false matrix: discovery: - k8s - dns profile: - emqx - emqx-enterprise steps: - uses: actions/checkout@v3 with: path: source - uses: actions/download-artifact@v3 with: name: "${{ env.EMQX_NAME }}-docker" path: /tmp - run: minikube start - run: | img="/tmp/${EMQX_NAME}-docker-${EMQX_TAG}.tar.gz" if stderr=$(minikube image load "${img}" 2>&1 >/dev/null) && test -n "$stderr"; then echo "${stderr}"; exit 1; fi - name: run emqx on chart (k8s) if: matrix.discovery == 'k8s' working-directory: source run: | helm install ${EMQX_NAME} \ --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="k8s" \ --set emqxConfig.EMQX_CLUSTER__K8S__APISERVER="https://kubernetes.default.svc:443" \ --set emqxConfig.EMQX_CLUSTER__K8S__SERVICE_NAME="${EMQX_NAME}-headless" \ --set emqxConfig.EMQX_CLUSTER__K8S__NAMESPACE="default" \ --set image.repository=$REPOSITORY \ --set image.pullPolicy=Never \ --set image.tag=$EMQX_TAG \ --set emqxAclConfig="" \ --set emqxConfig.EMQX_MQTT__RETRY_INTERVAL=2s \ --set emqxConfig.EMQX_MQTT__MAX_TOPIC_ALIAS=10 \ --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \ --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \ deploy/charts/${EMQX_NAME} \ --debug - name: run emqx on chart (dns) if: matrix.discovery == 'dns' working-directory: source run: | helm install ${EMQX_NAME} \ --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="dns" \ --set emqxConfig.EMQX_CLUSTER__DNS__RECORD_TYPE="srv" \ --set emqxConfig.EMQX_CLUSTER__DNS__NAME="${EMQX_NAME}-headless.default.svc.cluster.local" \ --set image.repository=$REPOSITORY \ --set image.pullPolicy=Never \ --set image.tag=$EMQX_TAG \ --set emqxAclConfig="" \ --set emqxConfig.EMQX_MQTT__RETRY_INTERVAL=2s \ --set emqxConfig.EMQX_MQTT__MAX_TOPIC_ALIAS=10 \ --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \ --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \ deploy/charts/${EMQX_NAME} \ --debug - name: waiting emqx started timeout-minutes: 5 run: | while [ "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${EMQX_NAME} -o jsonpath='{.items[0].status.replicas}')" \ != "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${EMQX_NAME} -o jsonpath='{.items[0].status.readyReplicas}')" ]; do echo "=============================="; kubectl get pods; echo "=============================="; echo "waiting emqx started"; sleep 10; done - name: Get Token run: | kubectl port-forward service/${EMQX_NAME} 18083:18083 > /dev/null & curl --head -X GET --retry 10 --retry-connrefused --retry-delay 6 http://localhost:18083/status echo "TOKEN=$(curl --silent -X 'POST' 'http://127.0.0.1:18083/api/v5/login' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"username": "admin","password": "public"}' | jq -r ".token")" >> $GITHUB_ENV - name: Check cluster timeout-minutes: 1 run: | while nodes_length="$(curl --silent -H "Authorization: Bearer $TOKEN" -X GET http://127.0.0.1:18083/api/v5/cluster| jq '.nodes|length')" [ $nodes_length != "3" ] do echo "waiting ${EMQX_NAME} cluster scale. Current live nodes: $nodes_length." sleep 1 done - uses: actions/checkout@v3 with: repository: emqx/paho.mqtt.testing ref: develop-5.0 path: paho.mqtt.testing - name: install pytest run: | pip install pytest==7.1.2 pytest-retry echo "$HOME/.local/bin" >> $GITHUB_PATH - name: run paho test timeout-minutes: 10 run: | port_connected () { local server="$1" local port="$2" echo > /dev/tcp/${server}/${port} 2>/dev/null } kubectl port-forward service/${EMQX_NAME} 1883:1883 > /dev/null & while ! port_connected localhost 1883; do echo server not listening yet... sleep 10 done pytest --retries 3 -v paho.mqtt.testing/interoperability/test_client/V5/test_connect.py -k test_basic --host "127.0.0.1" - if: failure() run: kubectl logs -l "app.kubernetes.io/instance=${EMQX_NAME}" -c emqx --tail=1000