Merge pull request #9591 from zmstone/1221-sync-release-v44-to-main-v4.4
1221 sync release v44 to main v4.4
This commit is contained in:
commit
43e77391db
|
@ -116,7 +116,20 @@ emqx_test(){
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"rpm")
|
"rpm")
|
||||||
yum install -y "${PACKAGE_PATH}/${packagename}"
|
# yum wants python2
|
||||||
|
if [[ "${SYSTEM:-}" == "amzn2" ]]; then
|
||||||
|
alternatives --list | grep python && alternatives --set python /usr/bin/python2
|
||||||
|
fi
|
||||||
|
YUM_RES="$(yum install -y "${PACKAGE_PATH}/${packagename}"| tee /dev/null)"
|
||||||
|
if [[ $YUM_RES =~ "Failed" ]]; then
|
||||||
|
echo "yum install failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# restore python3
|
||||||
|
if [[ "${SYSTEM:-}" == "amzn2" ]]; then
|
||||||
|
alternatives --list | grep python && alternatives --set python /usr/bin/python3
|
||||||
|
fi
|
||||||
|
|
||||||
if ! rpm -q "${PROFILE}" | grep -q "${PROFILE}"; then
|
if ! rpm -q "${PROFILE}" | grep -q "${PROFILE}"; then
|
||||||
echo "package install error"
|
echo "package install error"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -3,10 +3,6 @@ inputs:
|
||||||
otp: # 24.2.1-1, 23.3.4.9-3
|
otp: # 24.2.1-1, 23.3.4.9-3
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
os:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: macos-11
|
|
||||||
apple_id_password:
|
apple_id_password:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
@ -19,33 +15,55 @@ inputs:
|
||||||
apple_developer_id_bundle_password:
|
apple_developer_id_bundle_password:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
os:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: macos-11
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: prepare
|
- id: prepare
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||||
|
HOMEBREW_NO_INSTALL_UPGRADE: 1
|
||||||
|
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
|
||||||
run: |
|
run: |
|
||||||
brew update
|
brew update
|
||||||
brew install curl zip unzip gnu-sed coreutils unixodbc freetds openssl@1.1
|
brew install curl zip unzip gnu-sed coreutils autoconf automake cmake unixodbc freetds openssl@1.1
|
||||||
echo "/usr/local/opt/bison/bin" >> $GITHUB_PATH
|
echo "/usr/local/opt/bison/bin" >> $GITHUB_PATH
|
||||||
echo "/usr/local/bin" >> $GITHUB_PATH
|
echo "/usr/local/bin" >> $GITHUB_PATH
|
||||||
|
OTP_SOURCE_PATH="$HOME/src/otp-${{ inputs.otp }}"
|
||||||
|
OTP_INSTALL_PATH="$HOME/otp/${{ inputs.otp }}"
|
||||||
|
echo "OTP_SOURCE_PATH=$OTP_SOURCE_PATH" >> $GITHUB_OUTPUT
|
||||||
|
echo "OTP_INSTALL_PATH=$OTP_INSTALL_PATH" >> $GITHUB_OUTPUT
|
||||||
|
mkdir -p "$OTP_INSTALL_PATH"
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
id: cache
|
id: cache
|
||||||
with:
|
with:
|
||||||
path: /opt/erlang/${{ inputs.otp }}
|
path: ${{ steps.prepare.outputs.OTP_INSTALL_PATH }}
|
||||||
key: otp-install-${{ inputs.otp }}-${{ inputs.os }}-static-ssl-disable-hipe-disable-jit
|
key: otp-install-${{ inputs.otp }}-${{ inputs.os }}-static-ssl-disable-hipe-disable-jit
|
||||||
- name: build erlang
|
- name: build erlang
|
||||||
if: steps.cache.outputs.cache-hit != 'true'
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git clone --depth 1 --branch OTP-${{ inputs.otp }} https://github.com/emqx/otp.git $HOME/otp-${{ inputs.otp }}
|
OTP_SOURCE_PATH="${{ steps.prepare.outputs.OTP_SOURCE_PATH }}"
|
||||||
cd $HOME/otp-${{ inputs.otp }}
|
OTP_INSTALL_PATH="${{ steps.prepare.outputs.OTP_INSTALL_PATH }}"
|
||||||
./configure --disable-dynamic-ssl-lib --with-ssl=/usr/local/opt/openssl@1.1 --disable-hipe --disable-jit --prefix=/opt/erlang/${{ inputs.otp }}
|
if [ -d "$OTP_SOURCE_PATH" ]; then
|
||||||
|
rm -rf "$OTP_SOURCE_PATH"
|
||||||
|
fi
|
||||||
|
git clone --depth 1 --branch OTP-${{ inputs.otp }} https://github.com/emqx/otp.git "$OTP_SOURCE_PATH"
|
||||||
|
cd "$OTP_SOURCE_PATH"
|
||||||
|
./configure --disable-dynamic-ssl-lib --with-ssl=$(brew --prefix openssl@1.1) --disable-hipe --disable-jit --prefix="$OTP_INSTALL_PATH"
|
||||||
make -j$(nproc)
|
make -j$(nproc)
|
||||||
sudo make install
|
rm -rf "$OTP_INSTALL_PATH"
|
||||||
|
make install
|
||||||
- name: build
|
- name: build
|
||||||
env:
|
env:
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||||
|
HOMEBREW_NO_INSTALL_UPGRADE: 1
|
||||||
|
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
|
||||||
AUTO_INSTALL_BUILD_DEPS: 1
|
AUTO_INSTALL_BUILD_DEPS: 1
|
||||||
APPLE_SIGN_BINARIES: 1
|
APPLE_SIGN_BINARIES: 1
|
||||||
APPLE_ID: developers@emqx.io
|
APPLE_ID: developers@emqx.io
|
||||||
|
@ -56,13 +74,16 @@ runs:
|
||||||
APPLE_DEVELOPER_ID_BUNDLE_PASSWORD: ${{ inputs.apple_developer_id_bundle_password }}
|
APPLE_DEVELOPER_ID_BUNDLE_PASSWORD: ${{ inputs.apple_developer_id_bundle_password }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
export PATH="/opt/erlang/${{ inputs.otp }}/bin:$PATH"
|
export PATH="${{ steps.prepare.outputs.OTP_INSTALL_PATH }}/bin:$PATH"
|
||||||
make ensure-rebar3
|
make ensure-rebar3
|
||||||
sudo cp rebar3 /usr/local/bin/rebar3
|
mkdir -p $HOME/bin
|
||||||
|
cp rebar3 $HOME/bin/rebar3
|
||||||
|
export PATH="$HOME/bin:$PATH"
|
||||||
make ${EMQX_NAME}-zip
|
make ${EMQX_NAME}-zip
|
||||||
- name: test
|
- name: test
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
export PATH="${{ steps.prepare.outputs.OTP_INSTALL_PATH }}/bin:$PATH"
|
||||||
pkg_name=$(basename _packages/${EMQX_NAME}/${EMQX_NAME}-*.zip)
|
pkg_name=$(basename _packages/${EMQX_NAME}/${EMQX_NAME}-*.zip)
|
||||||
unzip -q _packages/${EMQX_NAME}/$pkg_name
|
unzip -q _packages/${EMQX_NAME}/$pkg_name
|
||||||
# test with a spaces in path
|
# test with a spaces in path
|
||||||
|
|
|
@ -13,7 +13,7 @@ jobs:
|
||||||
os:
|
os:
|
||||||
- ubuntu20.04
|
- ubuntu20.04
|
||||||
|
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:${{ matrix.erl_otp }}-${{ matrix.os }}
|
container: ghcr.io/emqx/emqx-builder/4.4-23:${{ matrix.erl_otp }}-${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
|
@ -59,7 +59,7 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
profile: ${{fromJSON(needs.prepare.outputs.profiles)}}
|
profile: ${{fromJSON(needs.prepare.outputs.profiles)}}
|
||||||
otp:
|
otp:
|
||||||
- 24.3.4.2
|
- 24.3.4.6
|
||||||
exclude:
|
exclude:
|
||||||
- profile: emqx-edge
|
- profile: emqx-edge
|
||||||
steps:
|
steps:
|
||||||
|
@ -70,7 +70,7 @@ jobs:
|
||||||
- name: unzip source code
|
- name: unzip source code
|
||||||
run: Expand-Archive -Path source.zip -DestinationPath ./
|
run: Expand-Archive -Path source.zip -DestinationPath ./
|
||||||
- uses: ilammy/msvc-dev-cmd@v1
|
- uses: ilammy/msvc-dev-cmd@v1
|
||||||
- uses: erlef/setup-beam@v1
|
- uses: emqx/setup-beam@v1.16.1-emqx
|
||||||
with:
|
with:
|
||||||
otp-version: ${{ matrix.otp }}
|
otp-version: ${{ matrix.otp }}
|
||||||
- name: build
|
- name: build
|
||||||
|
@ -110,9 +110,12 @@ jobs:
|
||||||
- 24.3.4.2-1
|
- 24.3.4.2-1
|
||||||
os:
|
os:
|
||||||
- macos-11
|
- macos-11
|
||||||
|
- macos-12-arm64
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- uses: emqx/self-hosted-cleanup-action@v1.0.3
|
||||||
|
if: matrix.os == 'macos-12-arm64'
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: source
|
name: source
|
||||||
|
@ -162,31 +165,17 @@ jobs:
|
||||||
- debian9
|
- debian9
|
||||||
- el8
|
- el8
|
||||||
- el7
|
- el7
|
||||||
# - raspbian10 #armv6l is too slow to emulate
|
- amzn2
|
||||||
exclude:
|
|
||||||
- os: raspbian9
|
|
||||||
arch: amd64
|
|
||||||
- os: raspbian10
|
|
||||||
arch: amd64
|
|
||||||
- os: raspbian9
|
|
||||||
profile: emqx
|
|
||||||
- os: raspbian10
|
|
||||||
profile: emqx
|
|
||||||
- os: raspbian9
|
|
||||||
profile: emqx-ee
|
|
||||||
- os: raspbian10
|
|
||||||
profile: emqx-ee
|
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: docker/setup-buildx-action@v2
|
|
||||||
- uses: docker/setup-qemu-action@v2
|
- uses: docker/setup-qemu-action@v2
|
||||||
with:
|
with:
|
||||||
image: tonistiigi/binfmt:latest
|
image: tonistiigi/binfmt:latest
|
||||||
platforms: all
|
platforms: all
|
||||||
|
- uses: docker/setup-buildx-action@v2
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: source
|
name: source
|
||||||
|
@ -206,7 +195,7 @@ jobs:
|
||||||
--profile "${PROFILE}" \
|
--profile "${PROFILE}" \
|
||||||
--pkgtype "${PACKAGE}" \
|
--pkgtype "${PACKAGE}" \
|
||||||
--arch "${ARCH}" \
|
--arch "${ARCH}" \
|
||||||
--builder "ghcr.io/emqx/emqx-builder/4.4-20:${OTP}-${SYSTEM}"
|
--builder "ghcr.io/emqx/emqx-builder/4.4-23:${OTP}-${SYSTEM}"
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.profile }}
|
name: ${{ matrix.profile }}
|
||||||
|
@ -239,11 +228,11 @@ jobs:
|
||||||
path: .
|
path: .
|
||||||
- name: unzip source code
|
- name: unzip source code
|
||||||
run: unzip -q source.zip
|
run: unzip -q source.zip
|
||||||
- uses: docker/setup-buildx-action@v2
|
|
||||||
- uses: docker/setup-qemu-action@v2
|
- uses: docker/setup-qemu-action@v2
|
||||||
with:
|
with:
|
||||||
image: tonistiigi/binfmt:latest
|
image: tonistiigi/binfmt:latest
|
||||||
platforms: all
|
platforms: all
|
||||||
|
- uses: docker/setup-buildx-action@v2
|
||||||
- uses: aws-actions/configure-aws-credentials@v1-node16
|
- uses: aws-actions/configure-aws-credentials@v1-node16
|
||||||
if: matrix.registry == 'public.ecr.aws'
|
if: matrix.registry == 'public.ecr.aws'
|
||||||
with:
|
with:
|
||||||
|
@ -271,7 +260,7 @@ jobs:
|
||||||
type=match,pattern=[v|e](.*),group=1
|
type=match,pattern=[v|e](.*),group=1
|
||||||
labels:
|
labels:
|
||||||
org.opencontainers.image.otp.version=${{ matrix.otp }}
|
org.opencontainers.image.otp.version=${{ matrix.otp }}
|
||||||
- uses: docker/build-push-action@v2
|
- uses: docker/build-push-action@v3
|
||||||
if: matrix.profile != 'emqx-ee'
|
if: matrix.profile != 'emqx-ee'
|
||||||
with:
|
with:
|
||||||
## only push when stable tag and rc tag
|
## only push when stable tag and rc tag
|
||||||
|
@ -282,7 +271,7 @@ jobs:
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
build-args: |
|
build-args: |
|
||||||
BUILD_FROM=ghcr.io/emqx/emqx-builder/4.4-20:${{ matrix.otp }}-alpine3.15.1
|
BUILD_FROM=ghcr.io/emqx/emqx-builder/4.4-23:${{ matrix.otp }}-alpine3.15.1
|
||||||
RUN_FROM=alpine:3.15.1
|
RUN_FROM=alpine:3.15.1
|
||||||
EMQX_NAME=${{ matrix.profile }}
|
EMQX_NAME=${{ matrix.profile }}
|
||||||
file: source/deploy/docker/Dockerfile
|
file: source/deploy/docker/Dockerfile
|
||||||
|
@ -298,7 +287,7 @@ jobs:
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
build-args: |
|
build-args: |
|
||||||
BUILD_FROM=ghcr.io/emqx/emqx-builder/4.4-20:${{ matrix.otp }}-alpine3.15.1
|
BUILD_FROM=ghcr.io/emqx/emqx-builder/4.4-23:${{ matrix.otp }}-alpine3.15.1
|
||||||
RUN_FROM=alpine:3.15.1
|
RUN_FROM=alpine:3.15.1
|
||||||
EMQX_NAME=${{ matrix.profile }}
|
EMQX_NAME=${{ matrix.profile }}
|
||||||
file: source/deploy/docker/Dockerfile.enterprise
|
file: source/deploy/docker/Dockerfile.enterprise
|
||||||
|
|
|
@ -20,7 +20,7 @@ jobs:
|
||||||
- 24.3.4.2-1
|
- 24.3.4.2-1
|
||||||
os:
|
os:
|
||||||
- ubuntu20.04
|
- ubuntu20.04
|
||||||
- el8
|
- el7
|
||||||
runs-on:
|
runs-on:
|
||||||
- aws-amd64
|
- aws-amd64
|
||||||
- ubuntu-20.04
|
- ubuntu-20.04
|
||||||
|
@ -32,7 +32,7 @@ jobs:
|
||||||
- runs-on: aws-amd64
|
- runs-on: aws-amd64
|
||||||
use-self-hosted: false
|
use-self-hosted: false
|
||||||
|
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:${{ matrix.otp }}-${{ matrix.os }}
|
container: ghcr.io/emqx/emqx-builder/4.4-23:${{ matrix.otp }}-${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: AutoModality/action-clean@v1
|
- uses: AutoModality/action-clean@v1
|
||||||
|
@ -84,11 +84,11 @@ jobs:
|
||||||
profile:
|
profile:
|
||||||
- emqx
|
- emqx
|
||||||
otp:
|
otp:
|
||||||
- 24.3.4.2
|
- 24.3.4.6
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: ilammy/msvc-dev-cmd@v1
|
- uses: ilammy/msvc-dev-cmd@v1
|
||||||
- uses: erlef/setup-beam@v1
|
- uses: emqx/setup-beam@v1.16.1-emqx
|
||||||
with:
|
with:
|
||||||
otp-version: ${{ matrix.otp }}
|
otp-version: ${{ matrix.otp }}
|
||||||
- name: build
|
- name: build
|
||||||
|
@ -120,8 +120,11 @@ jobs:
|
||||||
- 24.3.4.2-1
|
- 24.3.4.2-1
|
||||||
os:
|
os:
|
||||||
- macos-11
|
- macos-11
|
||||||
|
- macos-12-arm64
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
|
- uses: emqx/self-hosted-cleanup-action@v1.0.3
|
||||||
|
if: matrix.os == 'macos-12-arm64'
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # clone full git history
|
fetch-depth: 0 # clone full git history
|
||||||
|
@ -146,5 +149,5 @@ jobs:
|
||||||
path: ./rebar3.crashdump
|
path: ./rebar3.crashdump
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: macos
|
name: ${{ matrix.os }}
|
||||||
path: _packages/**/*.zip
|
path: _packages/**/*.zip
|
||||||
|
|
|
@ -5,7 +5,7 @@ on: [pull_request]
|
||||||
jobs:
|
jobs:
|
||||||
check_deps_integrity:
|
check_deps_integrity:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
|
@ -7,7 +7,7 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
prepare:
|
prepare:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
profiles: ${{ steps.detect-profiles.outputs.profiles}}
|
profiles: ${{ steps.detect-profiles.outputs.profiles}}
|
||||||
|
|
|
@ -5,7 +5,7 @@ on: workflow_dispatch
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
env:
|
env:
|
||||||
|
|
|
@ -27,9 +27,9 @@ jobs:
|
||||||
name: apache-jmeter.tgz
|
name: apache-jmeter.tgz
|
||||||
path: /tmp/apache-jmeter.tgz
|
path: /tmp/apache-jmeter.tgz
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: erlef/setup-beam@v1
|
- uses: emqx/setup-beam@v1.16.1-emqx
|
||||||
with:
|
with:
|
||||||
otp-version: "24.3.4.2"
|
otp-version: 24.3.4.6
|
||||||
- name: prepare
|
- name: prepare
|
||||||
id: prepare
|
id: prepare
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -13,9 +13,9 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: erlef/setup-beam@v1
|
- uses: emqx/setup-beam@v1.16.1-emqx
|
||||||
with:
|
with:
|
||||||
otp-version: "24.1.5"
|
otp-version: 24.3.4.6
|
||||||
- name: prepare
|
- name: prepare
|
||||||
run: |
|
run: |
|
||||||
if make emqx-ee --dry-run > /dev/null 2>&1; then
|
if make emqx-ee --dry-run > /dev/null 2>&1; then
|
||||||
|
@ -75,10 +75,15 @@ jobs:
|
||||||
- dns
|
- dns
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
<<<<<<< HEAD
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: erlef/setup-beam@v1
|
- uses: erlef/setup-beam@v1
|
||||||
|
=======
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- uses: emqx/setup-beam@v1.16.1-emqx
|
||||||
|
>>>>>>> origin/release-v44
|
||||||
with:
|
with:
|
||||||
otp-version: "24.1.5"
|
otp-version: 24.3.4.6
|
||||||
- name: prepare
|
- name: prepare
|
||||||
run: |
|
run: |
|
||||||
if make emqx-ee --dry-run > /dev/null 2>&1; then
|
if make emqx-ee --dry-run > /dev/null 2>&1; then
|
||||||
|
@ -200,7 +205,7 @@ jobs:
|
||||||
|
|
||||||
relup_test_plan:
|
relup_test_plan:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
outputs:
|
outputs:
|
||||||
profile: ${{ steps.profile-and-versions.outputs.profile }}
|
profile: ${{ steps.profile-and-versions.outputs.profile }}
|
||||||
vsn: ${{ steps.profile-and-versions.outputs.vsn }}
|
vsn: ${{ steps.profile-and-versions.outputs.vsn }}
|
||||||
|
@ -251,7 +256,7 @@ jobs:
|
||||||
otp:
|
otp:
|
||||||
- 24.3.4.2-1
|
- 24.3.4.2-1
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: bash
|
shell: bash
|
||||||
|
@ -288,7 +293,7 @@ jobs:
|
||||||
- relup_test_plan
|
- relup_test_plan
|
||||||
- relup_test_build
|
- relup_test_build
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
|
|
@ -12,7 +12,7 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
prepare:
|
prepare:
|
||||||
runs-on: aws-amd64
|
runs-on: aws-amd64
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
outputs:
|
outputs:
|
||||||
fast_ct_apps: ${{ steps.run_find_apps.outputs.fast_ct_apps }}
|
fast_ct_apps: ${{ steps.run_find_apps.outputs.fast_ct_apps }}
|
||||||
docker_ct_apps: ${{ steps.run_find_apps.outputs.docker_ct_apps }}
|
docker_ct_apps: ${{ steps.run_find_apps.outputs.docker_ct_apps }}
|
||||||
|
@ -58,7 +58,7 @@ jobs:
|
||||||
eunit_and_proper:
|
eunit_and_proper:
|
||||||
needs: prepare
|
needs: prepare
|
||||||
runs-on: aws-amd64
|
runs-on: aws-amd64
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -86,7 +86,7 @@ jobs:
|
||||||
fast_ct:
|
fast_ct:
|
||||||
needs: prepare
|
needs: prepare
|
||||||
runs-on: ${{ matrix.runs-on }}
|
runs-on: ${{ matrix.runs-on }}
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -249,7 +249,7 @@ jobs:
|
||||||
- fast_ct
|
- fast_ct
|
||||||
- docker_ct
|
- docker_ct
|
||||||
runs-on: aws-amd64
|
runs-on: aws-amd64
|
||||||
container: ghcr.io/emqx/emqx-builder/4.4-20:24.3.4.2-1-ubuntu20.04
|
container: ghcr.io/emqx/emqx-builder/4.4-23:24.3.4.2-1-ubuntu20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: AutoModality/action-clean@v1
|
- uses: AutoModality/action-clean@v1
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
{VSN,
|
{VSN,
|
||||||
[{"4.4.11",[
|
[{"4.4.11",[
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
|
||||||
]},
|
]},
|
||||||
{"4.4.10",
|
{"4.4.10",
|
||||||
|
@ -11,6 +14,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
@ -19,7 +24,6 @@
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.4.9",
|
{"4.4.9",
|
||||||
[{add_module,emqx_rule_engine_jwt},
|
[{add_module,emqx_rule_engine_jwt},
|
||||||
|
@ -27,6 +31,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
@ -35,7 +41,6 @@
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.4.8",
|
{"4.4.8",
|
||||||
|
@ -44,6 +49,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
@ -51,7 +58,6 @@
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
|
@ -61,6 +67,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
|
@ -68,7 +76,6 @@
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
||||||
|
@ -79,6 +86,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
|
@ -91,13 +100,14 @@
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]}]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
|
|
||||||
{"4.4.4",
|
{"4.4.4",
|
||||||
[{add_module,emqx_rule_engine_jwt},
|
[{add_module,emqx_rule_engine_jwt},
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
|
@ -105,7 +115,6 @@
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
|
@ -117,6 +126,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
|
@ -131,13 +142,14 @@
|
||||||
{add_module,emqx_rule_date},
|
{add_module,emqx_rule_date},
|
||||||
{load_module,emqx_rule_maps,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_maps,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
|
|
||||||
{"4.4.2",
|
{"4.4.2",
|
||||||
[{add_module,emqx_rule_engine_jwt},
|
[{add_module,emqx_rule_engine_jwt},
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
|
@ -153,13 +165,14 @@
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{add_module,emqx_rule_date},
|
{add_module,emqx_rule_date},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.4.1",
|
{"4.4.1",
|
||||||
[{add_module,emqx_rule_engine_jwt},
|
[{add_module,emqx_rule_engine_jwt},
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
|
@ -171,7 +184,6 @@
|
||||||
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
|
@ -182,6 +194,8 @@
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
{add_module,emqx_rule_engine_jwt_sup},
|
{add_module,emqx_rule_engine_jwt_sup},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}},
|
||||||
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
{apply,{emqx_rule_engine_sup,start_jwt_sup,[]}},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
|
@ -197,15 +211,18 @@
|
||||||
{update,emqx_rule_metrics,{advanced,["4.4.0"]}},
|
{update,emqx_rule_metrics,{advanced,["4.4.0"]}},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
|
|
||||||
{<<".*">>,[]}],
|
{<<".*">>,[]}],
|
||||||
[{"4.4.11",[
|
[{"4.4.11",[
|
||||||
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
|
||||||
]},
|
]},
|
||||||
{"4.4.10",
|
{"4.4.10",
|
||||||
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
|
@ -223,6 +240,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.9",
|
{"4.4.9",
|
||||||
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
|
@ -241,6 +259,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.8",
|
{"4.4.8",
|
||||||
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
|
@ -260,6 +279,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{<<"4\\.4\\.[6-7]">>,
|
{<<"4\\.4\\.[6-7]">>,
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
@ -279,6 +299,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.5",
|
{"4.4.5",
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
@ -299,6 +320,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.4",
|
{"4.4.4",
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
|
@ -319,6 +341,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.3",
|
{"4.4.3",
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
|
@ -341,6 +364,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.2",
|
{"4.4.2",
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
||||||
|
@ -364,6 +388,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.1",
|
{"4.4.1",
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
||||||
|
@ -387,6 +412,7 @@
|
||||||
{delete_module,emqx_rule_engine_jwt}]},
|
{delete_module,emqx_rule_engine_jwt}]},
|
||||||
{"4.4.0",
|
{"4.4.0",
|
||||||
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]},
|
||||||
|
{apply,{emqx_rule_engine_sup,ensure_api_delegator_stopped,[]}},
|
||||||
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_validator,brutal_purge,soft_purge,[]},
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
-module(emqx_rule_engine_api).
|
-module(emqx_rule_engine_api).
|
||||||
|
|
||||||
|
-behaviour(gen_server).
|
||||||
|
|
||||||
-include("rule_engine.hrl").
|
-include("rule_engine.hrl").
|
||||||
-include_lib("emqx/include/logger.hrl").
|
-include_lib("emqx/include/logger.hrl").
|
||||||
|
|
||||||
|
@ -156,6 +158,17 @@
|
||||||
descr => "List all events with detailed info"
|
descr => "List all events with detailed info"
|
||||||
}).
|
}).
|
||||||
|
|
||||||
|
-export([start_link/0]).
|
||||||
|
|
||||||
|
% gen_server Callbacks
|
||||||
|
-export([ init/1
|
||||||
|
, handle_call/3
|
||||||
|
, handle_cast/2
|
||||||
|
, handle_info/2
|
||||||
|
, terminate/2
|
||||||
|
, code_change/3
|
||||||
|
]).
|
||||||
|
|
||||||
-export([ create_rule/2
|
-export([ create_rule/2
|
||||||
, update_rule/2
|
, update_rule/2
|
||||||
, list_rules/2
|
, list_rules/2
|
||||||
|
@ -207,10 +220,90 @@
|
||||||
<<"Bad Arguments: ", R0/binary>>
|
<<"Bad Arguments: ", R0/binary>>
|
||||||
end).
|
end).
|
||||||
|
|
||||||
|
-define(T_CALL, 30000).
|
||||||
|
|
||||||
|
start_link() ->
|
||||||
|
%% The caller process (the cowboy process serves the HTTP request) may times out and dies
|
||||||
|
%% before some time-consuming operations complete, e.g. creating rules/resources or testing
|
||||||
|
%% the connectivity on unreachable resources.
|
||||||
|
%% To avoid this problem, we delegate the operations to a gen_server.
|
||||||
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
create_rule(_Bindings, Params) ->
|
||||||
|
delegate_call({create_rule, _Bindings, Params}).
|
||||||
|
|
||||||
|
update_rule(_Bindings, Params) ->
|
||||||
|
delegate_call({update_rule, _Bindings, Params}).
|
||||||
|
|
||||||
|
delete_rule(_Bindings, Params) ->
|
||||||
|
delegate_call({delete_rule, _Bindings, Params}).
|
||||||
|
|
||||||
|
create_resource(_Bindings, Params) ->
|
||||||
|
delegate_call({create_resource, _Bindings, Params}).
|
||||||
|
|
||||||
|
update_resource(_Bindings, Params) ->
|
||||||
|
delegate_call({update_resource, _Bindings, Params}).
|
||||||
|
|
||||||
|
start_resource(_Bindings, Params) ->
|
||||||
|
delegate_call({start_resource, _Bindings, Params}).
|
||||||
|
|
||||||
|
delete_resource(_Bindings, Params) ->
|
||||||
|
delegate_call({delete_resource, _Bindings, Params}).
|
||||||
|
|
||||||
|
%% delegate API calls to a single process.
|
||||||
|
delegate_call(Req) ->
|
||||||
|
gen_server:call(?MODULE, Req, ?T_CALL).
|
||||||
|
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
%% gen_server callbacks
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
init([]) ->
|
||||||
|
{ok, #{}}.
|
||||||
|
|
||||||
|
handle_call({create_rule, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_create_rule(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call({update_rule, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_update_rule(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call({delete_rule, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_delete_rule(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call({create_resource, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_create_resource(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call({start_resource, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_start_resource(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call({update_resource, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_update_resource(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call({delete_resource, _Bindings, Params}, _From, State) ->
|
||||||
|
{reply, delegate_delete_resource(_Bindings, Params), State};
|
||||||
|
|
||||||
|
handle_call(Req, _From, State) ->
|
||||||
|
?LOG(error, "unexpected call: ~p", [Req]),
|
||||||
|
{reply, ignored, State}.
|
||||||
|
|
||||||
|
handle_cast(Msg, State) ->
|
||||||
|
?LOG(error, "unexpected cast: ~p", [Msg]),
|
||||||
|
{noreply, State}.
|
||||||
|
|
||||||
|
handle_info(Info, State) ->
|
||||||
|
?LOG(error, "unexpected info: ~p", [Info]),
|
||||||
|
{noreply, State}.
|
||||||
|
|
||||||
|
terminate(_Reason, _State) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
{ok, State}.
|
||||||
|
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
%% Rules API
|
%% Rules API
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
create_rule(_Bindings, Params) ->
|
delegate_create_rule(_Bindings, Params) ->
|
||||||
if_test(fun() -> test_rule_sql(Params) end,
|
if_test(fun() -> test_rule_sql(Params) end,
|
||||||
fun() -> do_create_rule(Params) end,
|
fun() -> do_create_rule(Params) end,
|
||||||
Params).
|
Params).
|
||||||
|
@ -250,7 +343,7 @@ do_create_rule2(ParsedParams) ->
|
||||||
return({error, 400, ?ERR_BADARGS(Reason)})
|
return({error, 400, ?ERR_BADARGS(Reason)})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
update_rule(#{id := Id0}, Params) ->
|
delegate_update_rule(#{id := Id0}, Params) ->
|
||||||
Id = urldecode(Id0),
|
Id = urldecode(Id0),
|
||||||
case parse_rule_params(Params, #{id => Id}) of
|
case parse_rule_params(Params, #{id => Id}) of
|
||||||
{ok, ParsedParams} ->
|
{ok, ParsedParams} ->
|
||||||
|
@ -280,7 +373,7 @@ show_rule(#{id := Id0}, _Params) ->
|
||||||
Id = urldecode(Id0),
|
Id = urldecode(Id0),
|
||||||
reply_with(fun emqx_rule_registry:get_rule/1, Id).
|
reply_with(fun emqx_rule_registry:get_rule/1, Id).
|
||||||
|
|
||||||
delete_rule(#{id := Id0}, _Params) ->
|
delegate_delete_rule(#{id := Id0}, _Params) ->
|
||||||
Id = urldecode(Id0),
|
Id = urldecode(Id0),
|
||||||
ok = emqx_rule_engine:delete_rule(Id),
|
ok = emqx_rule_engine:delete_rule(Id),
|
||||||
return(ok).
|
return(ok).
|
||||||
|
@ -309,7 +402,7 @@ show_action(#{name := Name}, _Params) ->
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
%% Resources API
|
%% Resources API
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
create_resource(#{}, Params) ->
|
delegate_create_resource(#{}, Params) ->
|
||||||
case parse_resource_params(Params) of
|
case parse_resource_params(Params) of
|
||||||
{ok, ParsedParams} ->
|
{ok, ParsedParams} ->
|
||||||
if_test(fun() -> do_create_resource(test_resource, maps:without([id], ParsedParams)) end,
|
if_test(fun() -> do_create_resource(test_resource, maps:without([id], ParsedParams)) end,
|
||||||
|
@ -382,7 +475,7 @@ get_resource_status(#{id := Id0}, _Params) ->
|
||||||
return({error, 400, ?ERR_NO_RESOURCE(Id)})
|
return({error, 400, ?ERR_NO_RESOURCE(Id)})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
start_resource(#{id := Id0}, _Params) ->
|
delegate_start_resource(#{id := Id0}, _Params) ->
|
||||||
Id = urldecode(Id0),
|
Id = urldecode(Id0),
|
||||||
case emqx_rule_engine:start_resource(Id) of
|
case emqx_rule_engine:start_resource(Id) of
|
||||||
ok ->
|
ok ->
|
||||||
|
@ -394,7 +487,7 @@ start_resource(#{id := Id0}, _Params) ->
|
||||||
return({error, 400, ?ERR_BADARGS(Reason)})
|
return({error, 400, ?ERR_BADARGS(Reason)})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
update_resource(#{id := Id0}, NewParams) ->
|
delegate_update_resource(#{id := Id0}, NewParams) ->
|
||||||
Id = urldecode(Id0),
|
Id = urldecode(Id0),
|
||||||
P1 = case proplists:get_value(<<"description">>, NewParams) of
|
P1 = case proplists:get_value(<<"description">>, NewParams) of
|
||||||
undefined -> #{};
|
undefined -> #{};
|
||||||
|
@ -419,7 +512,7 @@ update_resource(#{id := Id0}, NewParams) ->
|
||||||
return({error, 400, ?ERR_BADARGS(Reason)})
|
return({error, 400, ?ERR_BADARGS(Reason)})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
delete_resource(#{id := Id0}, _Params) ->
|
delegate_delete_resource(#{id := Id0}, _Params) ->
|
||||||
Id = urldecode(Id0),
|
Id = urldecode(Id0),
|
||||||
case emqx_rule_engine:delete_resource(Id) of
|
case emqx_rule_engine:delete_resource(Id) of
|
||||||
ok -> return(ok);
|
ok -> return(ok);
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
-export([ start_locker/0
|
-export([ start_locker/0
|
||||||
, start_jwt_sup/0
|
, start_jwt_sup/0
|
||||||
|
, ensure_api_delegator_started/0
|
||||||
|
, ensure_api_delegator_stopped/0
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([init/1]).
|
-export([init/1]).
|
||||||
|
@ -58,7 +60,8 @@ init([]) ->
|
||||||
type => worker,
|
type => worker,
|
||||||
modules => [emqx_rule_monitor]},
|
modules => [emqx_rule_monitor]},
|
||||||
JWTSup = jwt_sup_child_spec(),
|
JWTSup = jwt_sup_child_spec(),
|
||||||
{ok, {SupFlags, [Registry, Metrics, Monitor, JWTSup]}}.
|
API = api_delegator_sup_spec(),
|
||||||
|
{ok, {SupFlags, [Registry, Metrics, Monitor, JWTSup, API]}}.
|
||||||
|
|
||||||
start_locker() ->
|
start_locker() ->
|
||||||
Locker = #{id => emqx_rule_locker,
|
Locker = #{id => emqx_rule_locker,
|
||||||
|
@ -97,3 +100,31 @@ ensure_table(Name, Opts) ->
|
||||||
error:badarg ->
|
error:badarg ->
|
||||||
ok
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
%% This is called by the emqx_rule_engine.appup.src when release upgrade
|
||||||
|
ensure_api_delegator_started() ->
|
||||||
|
case supervisor:start_child(?MODULE, api_delegator_sup_spec()) of
|
||||||
|
{ok, _} -> ok;
|
||||||
|
{error, already_present} -> ok;
|
||||||
|
{error, {already_started, _Pid}} -> ok;
|
||||||
|
{error, _} = Err -> throw({failed_to_start_ensure_api, Err})
|
||||||
|
end.
|
||||||
|
|
||||||
|
%% This is called by the emqx_rule_engine.appup.src when release downgrade
|
||||||
|
ensure_api_delegator_stopped() ->
|
||||||
|
case supervisor:terminate_child(?MODULE, emqx_rule_engine_api) of
|
||||||
|
ok ->
|
||||||
|
%% don't crash if delete failed
|
||||||
|
supervisor:delete_child(?MODULE, emqx_rule_engine_api);
|
||||||
|
{error, not_found} -> ok
|
||||||
|
end.
|
||||||
|
|
||||||
|
api_delegator_sup_spec() ->
|
||||||
|
#{
|
||||||
|
id => emqx_rule_engine_api,
|
||||||
|
start => {emqx_rule_engine_api, start_link, []},
|
||||||
|
restart => permanent,
|
||||||
|
shutdown => 5000,
|
||||||
|
type => worker,
|
||||||
|
modules => [emqx_rule_engine_api]
|
||||||
|
}.
|
||||||
|
|
30
build
30
build
|
@ -195,6 +195,24 @@ make_zip() {
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
amzn2)
|
||||||
|
case "$PKG_VSN" in
|
||||||
|
4.4.12*)
|
||||||
|
# this is the first version for amzn2, no relup
|
||||||
|
has_relup='no'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
macos*)
|
||||||
|
case "$PKG_VSN" in
|
||||||
|
4.4.12*)
|
||||||
|
# this is the first version for macos arm (M1/M2), no relup
|
||||||
|
if [ "$ARCH" = arm64 ]; then
|
||||||
|
has_relup='no'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
# shellcheck disable=SC2207
|
# shellcheck disable=SC2207
|
||||||
bases=($(relup_db base-vsns "$PKG_VSN"))
|
bases=($(relup_db base-vsns "$PKG_VSN"))
|
||||||
|
@ -228,10 +246,18 @@ make_zip() {
|
||||||
# --apple-id <apple id> \
|
# --apple-id <apple id> \
|
||||||
# --password <apple id password>
|
# --password <apple id password>
|
||||||
# --team-id <apple team id> <submission-id>
|
# --team-id <apple team id> <submission-id>
|
||||||
xcrun notarytool submit \
|
echo 'Submitting the package for notarization to Apple (normally takes about a minute)'
|
||||||
|
notarytool_output="$(xcrun notarytool submit \
|
||||||
--apple-id "${APPLE_ID}" \
|
--apple-id "${APPLE_ID}" \
|
||||||
--password "${APPLE_ID_PASSWORD}" \
|
--password "${APPLE_ID_PASSWORD}" \
|
||||||
--team-id "${APPLE_TEAM_ID}" "${target_zip}" --wait
|
--team-id "${APPLE_TEAM_ID}" "${target_zip}" \
|
||||||
|
--no-progress \
|
||||||
|
--wait)"
|
||||||
|
echo "$notarytool_output"
|
||||||
|
echo "$notarytool_output" | grep -q 'status: Accepted' || {
|
||||||
|
echo 'Notarization failed';
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
# sha256sum may not be available on macos
|
# sha256sum may not be available on macos
|
||||||
openssl dgst -sha256 "${target_zip}" | cut -d ' ' -f 2 > "${target_zip}.sha256"
|
openssl dgst -sha256 "${target_zip}" | cut -d ' ' -f 2 > "${target_zip}.sha256"
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
- Added support for specifying custom modules for custom authentication [#9297](https://github.com/emqx/emqx/pull/9297).
|
- Added support for specifying custom modules for custom authentication [#9297](https://github.com/emqx/emqx/pull/9297).
|
||||||
To support simple authentication rules, it is no longer necessary to implement a full-blown plugin.
|
To support simple authentication rules, it is no longer necessary to implement a full-blown plugin.
|
||||||
|
|
||||||
- Added a JWT management for Rule-Engin, for creating and refreshing JWT tokens in rule engine actions [#9241](https://github.com/emqx/emqx/pull/9241).
|
- Added a JWT management for Rule-Engine, for creating and refreshing JWT tokens in rule engine actions [#9241](https://github.com/emqx/emqx/pull/9241).
|
||||||
This feature is so far only used in EMQX Enterprise Google PubSub integration.
|
This feature is so far only used in EMQX Enterprise Google PubSub integration.
|
||||||
Can be used as webhook integration's JWT authenticationa against the webhook service endpoint.
|
Can be used as webhook integration's JWT authentication against the webhook service endpoint.
|
||||||
|
|
||||||
- Update `gen_rpc` dependency to 3.0.0.
|
- Update `gen_rpc` dependency to 3.0.0.
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,27 @@
|
||||||
### Enhancements
|
# v4.4.12
|
||||||
|
|
||||||
|
## Enhancements
|
||||||
|
|
||||||
|
- Added Amazon Linux 2 (amzn2) package release [#9498](https://github.com/emqx/emqx/pull/9498).
|
||||||
|
|
||||||
- Upgrade http client library `ehttpc` from `0.2.1` to `0.4.2` [#9456](https://github.com/emqx/emqx/pull/9456).
|
- Upgrade http client library `ehttpc` from `0.2.1` to `0.4.2` [#9456](https://github.com/emqx/emqx/pull/9456).
|
||||||
|
|
||||||
- Add more PSK ciphers support [#9493](https://github.com/emqx/emqx/pull/9493).
|
- Add more PSK ciphers support [#9493](https://github.com/emqx/emqx/pull/9493).
|
||||||
|
|
||||||
### Bug Fixes
|
- Users can define the `externalTrafficPolicy` of service in EMQX Helm Chart [#9527](https://github.com/emqx/emqx/pull/9527).
|
||||||
|
|
||||||
|
- Start building MacOS packages for Apple Silicon M1/M2 [#9558](https://github.com/emqx/emqx/pull/9558).
|
||||||
|
|
||||||
|
## Bug Fixes
|
||||||
|
|
||||||
- Fixed load bootstrap file when no bootstrap user in `mqtt_app` [#9474](https://github.com/emqx/emqx/pull/9474).
|
- Fixed load bootstrap file when no bootstrap user in `mqtt_app` [#9474](https://github.com/emqx/emqx/pull/9474).
|
||||||
|
|
||||||
- Trigger `message.dropped` hook when QoS2 message is resend by client with a same packet id, or 'awaiting_rel' queue is full [#9486](https://github.com/emqx/emqx/pull/9486).
|
- Trigger `message.dropped` hook when QoS2 message is resend by client with a same packet id, or 'awaiting_rel' queue is full [#9486](https://github.com/emqx/emqx/pull/9486).
|
||||||
|
|
||||||
- When dashboard creates a new user, the password length must match 3-32 and the format is `^[A-Za-z0-9]+[A-Za-z0-9-_]*$` [#9475](https://github.com/emqx/emqx-enterprise/pull/9475).
|
- When dashboard creates a new user, the password length must match 3-32 and the format is `^[A-Za-z0-9]+[A-Za-z0-9-_]*$` [#9475](https://github.com/emqx/emqx-enterprise/pull/9475).
|
||||||
|
|
||||||
|
- Fixed EMQX Helm Chart using incorrect secret values when custom credentials are provided [#9508](https://github.com/emqx/emqx/pull/9508).
|
||||||
|
|
||||||
|
- Fixed EMQX Helm Chart can not set JSON type value for EMQX Broker configuration items [#9504](https://github.com/emqx/emqx/pull/9504).
|
||||||
|
|
||||||
|
- When resource creation is too slow, there may be some temporary probing connections left [#9539](https://github.com/emqx/emqx/pull/9539).
|
||||||
|
|
|
@ -1,13 +1,28 @@
|
||||||
### 增强
|
# v4.4.12
|
||||||
|
|
||||||
|
|
||||||
|
## 增强
|
||||||
|
|
||||||
|
- 发布 Amazon Linux 2 安装包 [#9498](https://github.com/emqx/emqx/pull/9498)。
|
||||||
|
|
||||||
- HTTP 客户端库 `ehttpc` 从 `0.2.1` 升级到 `0.4.2` [#9456](https://github.com/emqx/emqx/pull/9456)。
|
- HTTP 客户端库 `ehttpc` 从 `0.2.1` 升级到 `0.4.2` [#9456](https://github.com/emqx/emqx/pull/9456)。
|
||||||
|
|
||||||
- 支持更多的 PSK 密码套件[#9493](https://github.com/emqx/emqx/pull/9493)。
|
- 支持更多的 PSK 密码套件[#9493](https://github.com/emqx/emqx/pull/9493)。
|
||||||
|
|
||||||
### 修复
|
- 用户可以在 EMQX Helm Chart 中自定义 service 资源的 `externalTrafficPolicy` [#9527](https://github.com/emqx/emqx/pull/9527)。
|
||||||
|
|
||||||
|
- 新增 Apple Silicon M1/M2 安装包发布 [#9558](https://github.com/emqx/emqx/pull/9558)。
|
||||||
|
|
||||||
|
## 修复
|
||||||
|
|
||||||
- 修复 mqtt_app 表内没有 boostrap user 里未导入用户的问题 [#9474](https://github.com/emqx/emqx/pull/9474).
|
- 修复 mqtt_app 表内没有 boostrap user 里未导入用户的问题 [#9474](https://github.com/emqx/emqx/pull/9474).
|
||||||
|
|
||||||
- 当 QoS2 消息被重发(使用相同 Packet ID),或当 'awaiting_rel' 队列已满时,触发消息丢弃钩子(`message.dropped`)及计数器 [#9486](https://github.com/emqx/emqx-enterprise/pull/9486)。
|
- 当 QoS2 消息被重发(使用相同 Packet ID),或当 'awaiting_rel' 队列已满时,触发消息丢弃钩子(`message.dropped`)及计数器 [#9486](https://github.com/emqx/emqx-enterprise/pull/9486)。
|
||||||
|
|
||||||
- 当控制台创建新用户时,密码长度必须在 3-32 之间,且格式为 `^[A-Za-z0-9]+[A-Za-z0-9-_]*$` [#9475](https://github.com/emqx/emqx-enterprise/pull/9475)。
|
- 当控制台创建新用户时,密码长度必须在 3-32 之间,且格式为 `^[A-Za-z0-9]+[A-Za-z0-9-_]*$` [#9475](https://github.com/emqx/emqx-enterprise/pull/9475)。
|
||||||
|
|
||||||
|
- 修复了 EMQX Helm Chart 中当用户使用自定义的用户名和密码时,创建的 Secret 资源不正确问题 [#9508](https://github.com/emqx/emqx/pull/9508)。
|
||||||
|
|
||||||
|
- 修复 EMQX Helm Chart 无法配置 value 为 JSON 类型的 EMQX Broker 配置项 [#9504](https://github.com/emqx/emqx/pull/9504)。
|
||||||
|
|
||||||
|
- 当创建资源过慢的情况下,有可能会残留一些用来探活的临时的连接 [#9539](https://github.com/emqx/emqx/pull/9539)。
|
||||||
|
|
|
@ -68,6 +68,7 @@ Parameter | Description | Default Value
|
||||||
`service.loadBalancerIP` | loadBalancerIP for Service | `nil`
|
`service.loadBalancerIP` | loadBalancerIP for Service | `nil`
|
||||||
`service.loadBalancerSourceRanges` | Address(es) that are allowed when service is LoadBalancer | `[]`
|
`service.loadBalancerSourceRanges` | Address(es) that are allowed when service is LoadBalancer | `[]`
|
||||||
`service.externalIPs` | ExternalIPs for the service | `[]`
|
`service.externalIPs` | ExternalIPs for the service | `[]`
|
||||||
|
`service.externalTrafficPolicy` | External Traffic Policy for the service | `Cluster`
|
||||||
`service.annotations` | Service annotations (evaluated as a template) | `{}`
|
`service.annotations` | Service annotations (evaluated as a template) | `{}`
|
||||||
`ingress.dashboard.enabled` | Enable ingress for EMQX Dashboard | false
|
`ingress.dashboard.enabled` | Enable ingress for EMQX Dashboard | false
|
||||||
`ingress.dashboard.ingressClassName` | Set the ingress class for EMQX Dashboard
|
`ingress.dashboard.ingressClassName` | Set the ingress class for EMQX Dashboard
|
||||||
|
|
|
@ -19,15 +19,18 @@ data:
|
||||||
EMQX_CLUSTER__K8S__ADDRESS_TYPE: "hostname"
|
EMQX_CLUSTER__K8S__ADDRESS_TYPE: "hostname"
|
||||||
EMQX_CLUSTER__K8S__SUFFIX: "svc.cluster.local"
|
EMQX_CLUSTER__K8S__SUFFIX: "svc.cluster.local"
|
||||||
{{- else if eq (.Values.emqxConfig.EMQX_CLUSTER__DISCOVERY) "dns" }}
|
{{- else if eq (.Values.emqxConfig.EMQX_CLUSTER__DISCOVERY) "dns" }}
|
||||||
EMQX_CLUSTER__DNS__NAME: "{{ .Release.Name }}-headless.{{ .Release.Namespace }}.svc.cluster.local"
|
|
||||||
EMQX_CLUSTER__DNS__APP: {{ .Release.Name }}
|
EMQX_CLUSTER__DNS__APP: {{ .Release.Name }}
|
||||||
|
EMQX_CLUSTER__DNS__NAME: "{{ include "emqx.fullname" . }}-headless.{{ .Release.Namespace }}.svc.cluster.local"
|
||||||
EMQX_CLUSTER__DNS__TYPE: "srv"
|
EMQX_CLUSTER__DNS__TYPE: "srv"
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- range $index, $value := .Values.emqxConfig }}
|
{{- range $index, $value := .Values.emqxConfig }}
|
||||||
{{- if $value }}
|
{{- if $value }}
|
||||||
{{- $key := (regexReplaceAllLiteral "\\." (regexReplaceAllLiteral "EMQX[_\\.]" (upper (trimAll " " $index)) "") "__") }}
|
{{- $key := (regexReplaceAllLiteral "\\." (regexReplaceAllLiteral "EMQX[_\\.]" (upper (trimAll " " $index)) "") "__") }}
|
||||||
|
{{- if or (kindIs "map" $value) (kindIs "slice" $value) }}
|
||||||
|
{{ print "EMQX_" $key }}: {{ tpl (printf "%q" (toJson $value)) $ }}
|
||||||
|
{{- else }}
|
||||||
{{ print "EMQX_" $key }}: "{{ tpl (printf "%v" $value) $ }}"
|
{{ print "EMQX_" $key }}: "{{ tpl (printf "%v" $value) $ }}"
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
|
@ -6,14 +6,6 @@ metadata:
|
||||||
namespace: {{ .Release.Namespace }}
|
namespace: {{ .Release.Namespace }}
|
||||||
type: kubernetes.io/basic-auth
|
type: kubernetes.io/basic-auth
|
||||||
stringData:
|
stringData:
|
||||||
{{- if not (empty .Values.emqxConfig.EMQX_MANAGEMENT__DEFAULT_APPLICATION__ID) }}
|
username: {{ .Values.emqxConfig.EMQX_MANAGEMENT__DEFAULT_APPLICATION__ID | default "admin" }}
|
||||||
username: admin
|
password: {{ .Values.emqxConfig.EMQX_MANAGEMENT__DEFAULT_APPLICATION__SECRET | default "public" }}
|
||||||
{{- else }}
|
|
||||||
username: {{ .Values.emqxConfig.EMQX_MANAGEMENT__DEFAULT_APPLICATION__ID }}
|
|
||||||
{{- end }}
|
|
||||||
{{- if not (empty .Values.emqxConfig.EMQX_MANAGEMENT__DEFAULT_APPLICATION__SECRET) }}
|
|
||||||
password: public
|
|
||||||
{{- else }}
|
|
||||||
password: {{ .Values.emqxConfig.EMQX_MANAGEMENT__DEFAULT_APPLICATION__SECRET}}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
{{- end }}
|
|
@ -14,6 +14,9 @@ metadata:
|
||||||
{{- end }}
|
{{- end }}
|
||||||
spec:
|
spec:
|
||||||
type: {{ .Values.service.type }}
|
type: {{ .Values.service.type }}
|
||||||
|
{{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }}
|
||||||
|
externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | default "Cluster" }}
|
||||||
|
{{- end }}
|
||||||
{{- if eq .Values.service.type "LoadBalancer" }}
|
{{- if eq .Values.service.type "LoadBalancer" }}
|
||||||
{{- if .Values.service.loadBalancerIP }}
|
{{- if .Values.service.loadBalancerIP }}
|
||||||
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||||
|
|
|
@ -72,7 +72,7 @@ initContainers: {}
|
||||||
|
|
||||||
## EMQX configuration item, see the documentation (https://hub.docker.com/r/emqx/emqx)
|
## EMQX configuration item, see the documentation (https://hub.docker.com/r/emqx/emqx)
|
||||||
emqxConfig:
|
emqxConfig:
|
||||||
## Cluster discovery by k8s
|
## Cluster discovery by 'k8s' or 'dns'
|
||||||
EMQX_CLUSTER__DISCOVERY: "k8s"
|
EMQX_CLUSTER__DISCOVERY: "k8s"
|
||||||
EMQX_MANAGEMENT__DEFAULT_APPLICATION__ID: "admin"
|
EMQX_MANAGEMENT__DEFAULT_APPLICATION__ID: "admin"
|
||||||
EMQX_MANAGEMENT__DEFAULT_APPLICATION__SECRET: "public"
|
EMQX_MANAGEMENT__DEFAULT_APPLICATION__SECRET: "public"
|
||||||
|
@ -174,6 +174,12 @@ service:
|
||||||
## Set the ExternalIPs
|
## Set the ExternalIPs
|
||||||
##
|
##
|
||||||
externalIPs: []
|
externalIPs: []
|
||||||
|
## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints.
|
||||||
|
## There are two available options: Cluster (default) and Local.
|
||||||
|
## Cluster obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.
|
||||||
|
## Local preserves the client source IP and avoids a second hop for LoadBalancer and NodePort type Services, but risks potentially imbalanced traffic spreading.
|
||||||
|
##
|
||||||
|
externalTrafficPolicy: "Cluster"
|
||||||
## Provide any additional annotations which may be required. Evaluated as a template
|
## Provide any additional annotations which may be required. Evaluated as a template
|
||||||
##
|
##
|
||||||
annotations: {}
|
annotations: {}
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
-ifndef(EMQX_ENTERPRISE).
|
-ifndef(EMQX_ENTERPRISE).
|
||||||
|
|
||||||
-define(EMQX_RELEASE, {opensource, "4.4.12-alpha.1"}).
|
-define(EMQX_RELEASE, {opensource, "4.4.12-alpha.2"}).
|
||||||
|
|
||||||
-else.
|
-else.
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
{cover_opts, [verbose]}.
|
{cover_opts, [verbose]}.
|
||||||
{cover_export_enabled, true}.
|
{cover_export_enabled, true}.
|
||||||
{cover_excl_mods, [emqx_exproto_pb, emqx_exhook_pb]}.
|
{cover_excl_mods, [emqx_exproto_pb, emqx_exhook_pb, emqx_cover]}.
|
||||||
|
|
||||||
{provider_hooks, [{pre, [{release, {relup_helper, gen_appups}}]}]}.
|
{provider_hooks, [{pre, [{release, {relup_helper, gen_appups}}]}]}.
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
||||||
{deps,
|
{deps,
|
||||||
[ {gpb, "4.11.2"} %% gpb only used to build, but not for release, pin it here to avoid fetching a wrong version due to rebar plugins scattered in all the deps
|
[ {gpb, "4.11.2"} %% gpb only used to build, but not for release, pin it here to avoid fetching a wrong version due to rebar plugins scattered in all the deps
|
||||||
, {redbug, "2.0.7"}
|
, {redbug, "2.0.7"}
|
||||||
|
, {covertool, {git, "https://github.com/zmstone/covertool", {tag, "2.0.4.1"}}}
|
||||||
, {ehttpc, {git, "https://github.com/emqx/ehttpc", {tag, "0.4.2"}}}
|
, {ehttpc, {git, "https://github.com/emqx/ehttpc", {tag, "0.4.2"}}}
|
||||||
, {gun, {git, "https://github.com/emqx/gun", {tag, "1.3.8"}}}
|
, {gun, {git, "https://github.com/emqx/gun", {tag, "1.3.8"}}}
|
||||||
, {eredis_cluster, {git, "https://github.com/emqx/eredis_cluster", {tag, "0.7.4"}}}
|
, {eredis_cluster, {git, "https://github.com/emqx/eredis_cluster", {tag, "0.7.4"}}}
|
||||||
|
|
|
@ -253,6 +253,7 @@ relx_apps(ReleaseType) ->
|
||||||
, {ekka, load}
|
, {ekka, load}
|
||||||
, {emqx_plugin_libs, load}
|
, {emqx_plugin_libs, load}
|
||||||
, observer_cli
|
, observer_cli
|
||||||
|
, {covertool, load}
|
||||||
]
|
]
|
||||||
++ [emqx_modules || not is_enterprise()]
|
++ [emqx_modules || not is_enterprise()]
|
||||||
++ [emqx_license || is_enterprise()]
|
++ [emqx_license || is_enterprise()]
|
||||||
|
|
|
@ -14,7 +14,11 @@ case "$UNAME" in
|
||||||
SYSTEM="${DIST}${VERSION_ID}"
|
SYSTEM="${DIST}${VERSION_ID}"
|
||||||
;;
|
;;
|
||||||
Linux)
|
Linux)
|
||||||
if grep -q -i 'rhel' /etc/*-release; then
|
# /etc/os-release on amazon linux 2 contains both rhel and centos strings
|
||||||
|
if grep -q -i 'amzn' /etc/*-release; then
|
||||||
|
DIST='amzn'
|
||||||
|
VERSION_ID="$(sed -n '/^VERSION_ID=/p' /etc/os-release | sed -r 's/VERSION_ID=(.*)/\1/g' | sed 's/"//g')"
|
||||||
|
elif grep -q -i 'rhel' /etc/*-release; then
|
||||||
DIST='el'
|
DIST='el'
|
||||||
VERSION_ID="$(rpm --eval '%{rhel}')"
|
VERSION_ID="$(rpm --eval '%{rhel}')"
|
||||||
elif grep -q -i 'centos' /etc/*-release; then
|
elif grep -q -i 'centos' /etc/*-release; then
|
||||||
|
|
|
@ -43,10 +43,24 @@ done
|
||||||
security -v list-keychains -s "${keychain_names[@]}" "${KEYCHAIN}"
|
security -v list-keychains -s "${keychain_names[@]}" "${KEYCHAIN}"
|
||||||
|
|
||||||
# known runtime executables and binaries
|
# known runtime executables and binaries
|
||||||
codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime "${REL_DIR}"/erts-*/bin/{beam.smp,dyn_erl,epmd,erl,erl_call,erl_child_setup,erlexec,escript,heart,inet_gethost,run_erl,to_erl}
|
codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime \
|
||||||
codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime "${REL_DIR}"/lib/runtime_tools-*/priv/lib/{dyntrace.so,trace_ip_drv.so,trace_file_drv.so}
|
"${REL_DIR}"/erts-*/bin/{beam.smp,dyn_erl,epmd,erl,erl_call,erl_child_setup,erlexec,escript,heart,inet_gethost,run_erl,to_erl}
|
||||||
codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime "${REL_DIR}"/lib/os_mon-*/priv/bin/{cpu_sup,memsup}
|
codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime \
|
||||||
|
"${REL_DIR}"/lib/runtime_tools-*/priv/lib/{dyntrace.so,trace_ip_drv.so,trace_file_drv.so}
|
||||||
|
codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime \
|
||||||
|
"${REL_DIR}"/lib/os_mon-*/priv/bin/{cpu_sup,memsup}
|
||||||
# other files from runtime and dependencies
|
# other files from runtime and dependencies
|
||||||
for f in asn1rt_nif.so bcrypt_nif.so crypto.so otp_test_engine.so crypto_callback.so jiffy.so crc32cer_nif.so sasl_auth.so snappyer.so odbcserver; do
|
for f in \
|
||||||
|
asn1rt_nif.so \
|
||||||
|
bcrypt_nif.so \
|
||||||
|
crypto.so \
|
||||||
|
otp_test_engine.so \
|
||||||
|
crypto_callback.so \
|
||||||
|
jiffy.so \
|
||||||
|
crc32cer_nif.so \
|
||||||
|
sasl_auth.so \
|
||||||
|
snappyer.so \
|
||||||
|
odbcserver \
|
||||||
|
; do
|
||||||
find "${REL_DIR}"/lib/ -name "$f" -exec codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime {} \;
|
find "${REL_DIR}"/lib/ -name "$f" -exec codesign -s "${APPLE_DEVELOPER_IDENTITY}" -f --verbose=4 --timestamp --options=runtime {} \;
|
||||||
done
|
done
|
||||||
|
|
|
@ -14,4 +14,5 @@
|
||||||
, {mnesia, load}
|
, {mnesia, load}
|
||||||
, xmerl
|
, xmerl
|
||||||
, tools
|
, tools
|
||||||
|
, covertool % this is not really a otp app, but we don't need to worry about relup of it
|
||||||
].
|
].
|
||||||
|
|
|
@ -162,16 +162,26 @@ filter_froms(Froms0, AvailableVersionsIndex) ->
|
||||||
Froms1 =
|
Froms1 =
|
||||||
case get_system() of
|
case get_system() of
|
||||||
%% we do not support relup for windows
|
%% we do not support relup for windows
|
||||||
"windows" ->
|
{"windows", _} ->
|
||||||
[];
|
[];
|
||||||
%% debian11 is introduced since v4.4.2 and e4.4.2
|
%% debian11 is introduced since v4.4.2 and e4.4.2
|
||||||
%% exclude tags before them
|
%% exclude tags before them
|
||||||
"debian11" ->
|
{"debian11", _} ->
|
||||||
lists:filter(
|
lists:filter(
|
||||||
fun(Vsn) ->
|
fun(Vsn) ->
|
||||||
not lists:member(Vsn, [<<"4.4.0">>, <<"4.4.1">>])
|
not lists:member(Vsn, [<<"4.4.0">>, <<"4.4.1">>])
|
||||||
end, Froms0);
|
end, Froms0);
|
||||||
_ ->
|
%% amzn2 is introduced since v4.4.12 and e4.4.12
|
||||||
|
%% exclude tags before them
|
||||||
|
{"amzn2", _} ->
|
||||||
|
Excluded = [list_to_binary(["4.4.", integer_to_list(X)]) || X <- lists:seq(0,11)],
|
||||||
|
lists:filter(fun(Vsn) -> not lists:member(Vsn, Excluded) end, Froms0);
|
||||||
|
%% macos arm64 (M1/M2) packages are introduced since v4.4.12 and e4.4.12
|
||||||
|
%% exclude tags before them
|
||||||
|
{"macos" ++ _, "aarch64" ++ _} ->
|
||||||
|
Excluded = [list_to_binary(["4.4.", integer_to_list(X)]) || X <- lists:seq(0,11)],
|
||||||
|
lists:filter(fun(Vsn) -> not lists:member(Vsn, Excluded) end, Froms0);
|
||||||
|
{_, _} ->
|
||||||
Froms0
|
Froms0
|
||||||
end,
|
end,
|
||||||
lists:filter(
|
lists:filter(
|
||||||
|
@ -179,11 +189,12 @@ filter_froms(Froms0, AvailableVersionsIndex) ->
|
||||||
Froms1).
|
Froms1).
|
||||||
|
|
||||||
get_system() ->
|
get_system() ->
|
||||||
|
Arch = erlang:system_info(system_architecture),
|
||||||
case os:getenv("SYSTEM") of
|
case os:getenv("SYSTEM") of
|
||||||
false ->
|
false ->
|
||||||
string:trim(os:cmd("./scripts/get-distro.sh"));
|
{string:trim(os:cmd("./scripts/get-distro.sh")), Arch};
|
||||||
System ->
|
System ->
|
||||||
System
|
{System, Arch}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%% assumes that's X.Y.Z, without pre-releases
|
%% assumes that's X.Y.Z, without pre-releases
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
, excl_apps =>
|
, excl_apps =>
|
||||||
[ observer
|
[ observer
|
||||||
, redbug
|
, redbug
|
||||||
|
, covertool
|
||||||
]
|
]
|
||||||
, excl_mods =>
|
, excl_mods =>
|
||||||
[ hipe_unified_loader
|
[ hipe_unified_loader
|
||||||
|
@ -14,6 +15,7 @@
|
||||||
, basho_bench_driver_erldis
|
, basho_bench_driver_erldis
|
||||||
, release_handler
|
, release_handler
|
||||||
, cuttlefish_rebar_plugin
|
, cuttlefish_rebar_plugin
|
||||||
|
, emqx_cover
|
||||||
]
|
]
|
||||||
, filters =>
|
, filters =>
|
||||||
[{{coap_client,channel_apply,3},{coap_dtls_socket,close,1}},
|
[{{coap_client,channel_apply,3},{coap_dtls_socket,close,1}},
|
||||||
|
@ -239,6 +241,7 @@
|
||||||
, analysis => undefined_functions
|
, analysis => undefined_functions
|
||||||
, excl_apps =>
|
, excl_apps =>
|
||||||
[ observer
|
[ observer
|
||||||
|
, covertool
|
||||||
]
|
]
|
||||||
, excl_mods =>
|
, excl_mods =>
|
||||||
[ systools
|
[ systools
|
||||||
|
@ -246,6 +249,7 @@
|
||||||
, release_handler
|
, release_handler
|
||||||
, systools_relup
|
, systools_relup
|
||||||
, cuttlefish_rebar_plugin
|
, cuttlefish_rebar_plugin
|
||||||
|
, emqx_cover
|
||||||
]
|
]
|
||||||
, filters =>
|
, filters =>
|
||||||
[{'Elixir.Atom',to_string,1},
|
[{'Elixir.Atom',to_string,1},
|
||||||
|
|
|
@ -18,16 +18,68 @@
|
||||||
%% It is used to collect coverage data when running blackbox test
|
%% It is used to collect coverage data when running blackbox test
|
||||||
-module(emqx_cover).
|
-module(emqx_cover).
|
||||||
|
|
||||||
|
-include_lib("covertool/include/covertool.hrl").
|
||||||
|
|
||||||
|
-ifdef(EMQX_ENTERPRISE).
|
||||||
|
-define(OUTPUT_APPNAME, 'EMQX Enterprise').
|
||||||
|
-else.
|
||||||
|
-define(OUTPUT_APPNAME, 'EMQX').
|
||||||
|
-endif.
|
||||||
|
|
||||||
-export([start/0,
|
-export([start/0,
|
||||||
start/1,
|
start/1,
|
||||||
export_and_stop/1
|
abort/0,
|
||||||
|
export_and_stop/1,
|
||||||
|
lookup_source/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
%% This is a ETS table to keep a mapping of module name (atom) to
|
||||||
|
%% .erl file path (relative path from project root)
|
||||||
|
%% We needed this ETS table because the source file information
|
||||||
|
%% is missing from the .beam metadata sicne we are using 'deterministic'
|
||||||
|
%% compile flag.
|
||||||
|
-define(SRC, emqx_cover_module_src).
|
||||||
|
|
||||||
|
%% @doc Start cover.
|
||||||
|
%% All emqx_ modules will be cover-compiled, this may cause
|
||||||
|
%% some excessive RAM consumption and result in warning logs.
|
||||||
start() ->
|
start() ->
|
||||||
start(#{}).
|
start(#{}).
|
||||||
|
|
||||||
|
%% @doc Start cover.
|
||||||
|
%% All emqx_ modules will be cover-compiled, this may cause
|
||||||
|
%% some excessive RAM consumption and result in warning logs.
|
||||||
|
%% Supported options:
|
||||||
|
%% - project_root: the directory to search for .erl source code
|
||||||
|
%% - debug_secret_file: only applicable to EMQX Enterprise
|
||||||
start(Opts) ->
|
start(Opts) ->
|
||||||
ok = maybe_set_secret(),
|
ok = abort(),
|
||||||
|
%% spawn a ets table owner
|
||||||
|
%% this implementation is kept dead-simple
|
||||||
|
%% because there is no concurrency requirement
|
||||||
|
Parent = self(),
|
||||||
|
{Pid, Ref} =
|
||||||
|
erlang:spawn_monitor(
|
||||||
|
fun() ->
|
||||||
|
true = register(?SRC, self()),
|
||||||
|
_ = ets:new(?SRC, [named_table, public]),
|
||||||
|
_ = Parent ! {started, self()},
|
||||||
|
receive
|
||||||
|
stop ->
|
||||||
|
ok
|
||||||
|
end
|
||||||
|
end),
|
||||||
|
receive
|
||||||
|
{started, Pid} ->
|
||||||
|
ok;
|
||||||
|
{'DOWN', Ref, process, Pid, Reason} ->
|
||||||
|
throw({failed_to_start, Reason})
|
||||||
|
after
|
||||||
|
1000 ->
|
||||||
|
throw({failed_to_start, timeout})
|
||||||
|
end,
|
||||||
|
Modules = modules(Opts),
|
||||||
|
ok = maybe_set_secret(Opts),
|
||||||
case cover:start() of
|
case cover:start() of
|
||||||
{ok, _Pid} ->
|
{ok, _Pid} ->
|
||||||
ok;
|
ok;
|
||||||
|
@ -36,28 +88,97 @@ start(Opts) ->
|
||||||
Other ->
|
Other ->
|
||||||
throw(Other)
|
throw(Other)
|
||||||
end,
|
end,
|
||||||
ok = cover_compile(Opts).
|
ok = cover_compile(Modules),
|
||||||
|
io:format("cover-compiled ~p modules~n", [length(Modules)]),
|
||||||
export_and_stop(Path) ->
|
ok = build_source_mapping(Opts, sets:from_list(Modules, [{version, 2}])),
|
||||||
ok = cover:export(Path),
|
CachedModulesCount = ets:info(?SRC, size),
|
||||||
_ = cover:stop(),
|
io:format("source-cached ~p modules~n", [CachedModulesCount]),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
maybe_set_secret() ->
|
%% @doc Abort cover data collection without exporting.
|
||||||
case os:getenv("EMQX_DEBUG_SECRET_FILE") of
|
abort() ->
|
||||||
|
_ = cover:stop(),
|
||||||
|
case whereis(?SRC) of
|
||||||
|
undefined -> ok;
|
||||||
|
Pid ->
|
||||||
|
Ref = monitor(process, Pid),
|
||||||
|
exit(Pid, kill),
|
||||||
|
receive
|
||||||
|
{'DOWN', Ref, process, Pid, _} ->
|
||||||
|
ok
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
ok.
|
||||||
|
|
||||||
|
%% @doc Export coverage report (xml) format.
|
||||||
|
%% e.g. `emqx_cover:export_and_stop("/tmp/cover.xml").'
|
||||||
|
export_and_stop(Path) when is_list(Path) ->
|
||||||
|
ProjectRoot = get_project_root(),
|
||||||
|
Config = #config{appname = ?OUTPUT_APPNAME,
|
||||||
|
sources = [ProjectRoot],
|
||||||
|
output = Path,
|
||||||
|
lookup_source = fun ?MODULE:lookup_source/1
|
||||||
|
},
|
||||||
|
covertool:generate_report(Config, cover:modules()).
|
||||||
|
|
||||||
|
build_source_mapping(Opts, Modules) ->
|
||||||
|
Default = os_env("EMQX_PROJECT_ROOT"),
|
||||||
|
case maps:get(project_root, Opts, Default) of
|
||||||
|
"" ->
|
||||||
|
io:format(standard_error, "EMQX_PROJECT_ROOT is not set", []),
|
||||||
|
throw(emqx_project_root_undefined);
|
||||||
|
Dir ->
|
||||||
|
ok = put_project_root(Dir),
|
||||||
|
ok = do_build_source_mapping(Dir, Modules)
|
||||||
|
end.
|
||||||
|
|
||||||
|
get_project_root() ->
|
||||||
|
[{_, Dir}] = ets:lookup(?SRC, {root, ?OUTPUT_APPNAME}),
|
||||||
|
Dir.
|
||||||
|
|
||||||
|
put_project_root(Dir) ->
|
||||||
|
_ = ets:insert(?SRC, {{root, ?OUTPUT_APPNAME}, Dir}),
|
||||||
|
ok.
|
||||||
|
|
||||||
|
do_build_source_mapping(Dir, Modules) ->
|
||||||
|
All = filelib:wildcard("**/*.erl", Dir),
|
||||||
|
lists:foreach(
|
||||||
|
fun(Path) ->
|
||||||
|
ModuleNameStr = filename:basename(Path, ".erl"),
|
||||||
|
Module = list_to_atom(ModuleNameStr),
|
||||||
|
case sets:is_element(Module, Modules) of
|
||||||
|
true ->
|
||||||
|
ets:insert(?SRC, {Module, Path});
|
||||||
false ->
|
false ->
|
||||||
ok;
|
ok
|
||||||
|
end
|
||||||
|
end, All),
|
||||||
|
ok.
|
||||||
|
|
||||||
|
lookup_source(Module) ->
|
||||||
|
case ets:lookup(?SRC, Module) of
|
||||||
|
[{_, Path}] ->
|
||||||
|
Path;
|
||||||
|
[] ->
|
||||||
|
false
|
||||||
|
end.
|
||||||
|
|
||||||
|
maybe_set_secret(Opts) ->
|
||||||
|
Default = os_env("EMQX_DEBUG_SECRET_FILE"),
|
||||||
|
case maps:get(debug_secret_file, Opts, Default) of
|
||||||
"" ->
|
"" ->
|
||||||
ok;
|
ok;
|
||||||
File ->
|
File ->
|
||||||
ok = emqx:set_debug_secret(File)
|
ok = emqx:set_debug_secret(File)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
cover_compile(_Opts) ->
|
modules(_Opts) ->
|
||||||
%% TODO better filter based on Opts,
|
%% TODO better filter based on Opts,
|
||||||
%% e.g. we may want to see coverage info for ehttpc
|
%% e.g. we may want to see coverage info for ehttpc
|
||||||
Filter = fun is_emqx_module/1,
|
Filter = fun is_emqx_module/1,
|
||||||
Modules = find_modules(Filter),
|
find_modules(Filter).
|
||||||
|
|
||||||
|
cover_compile(Modules) ->
|
||||||
Results = cover:compile_beam(Modules),
|
Results = cover:compile_beam(Modules),
|
||||||
Errors = lists:filter(fun({ok, _}) -> false;
|
Errors = lists:filter(fun({ok, _}) -> false;
|
||||||
(_) -> true
|
(_) -> true
|
||||||
|
@ -66,14 +187,14 @@ cover_compile(_Opts) ->
|
||||||
[] ->
|
[] ->
|
||||||
ok;
|
ok;
|
||||||
_ ->
|
_ ->
|
||||||
io:format(user, "failed_to_cover_compile:~n~p~n", [Errors]),
|
io:format("failed_to_cover_compile:~n~p~n", [Errors]),
|
||||||
throw(failed_to_cover_compile)
|
throw(failed_to_cover_compile)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
find_modules(Filter) ->
|
find_modules(Filter) ->
|
||||||
All = code:all_loaded(),
|
All = code:all_loaded(),
|
||||||
F = fun({M, _BeamPath}) -> Filter(M) end,
|
F = fun({M, _BeamPath}) -> Filter(M) andalso {true, M} end,
|
||||||
lists:filter(F, All).
|
lists:filtermap(F, All).
|
||||||
|
|
||||||
is_emqx_module(?MODULE) ->
|
is_emqx_module(?MODULE) ->
|
||||||
%% do not cover-compile self
|
%% do not cover-compile self
|
||||||
|
@ -85,3 +206,6 @@ is_emqx_module(Module) ->
|
||||||
_ ->
|
_ ->
|
||||||
false
|
false
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
os_env(Name) ->
|
||||||
|
os:getenv(Name, "").
|
||||||
|
|
|
@ -30,6 +30,7 @@ init_per_suite(Config) ->
|
||||||
Config.
|
Config.
|
||||||
|
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(_Config) ->
|
||||||
|
emqx_ct_helpers:boot_modules(all),
|
||||||
emqx_ct_helpers:stop_apps([]).
|
emqx_ct_helpers:stop_apps([]).
|
||||||
|
|
||||||
t_authenticate(_) ->
|
t_authenticate(_) ->
|
||||||
|
|
|
@ -29,6 +29,7 @@ init_per_suite(Config) ->
|
||||||
Config.
|
Config.
|
||||||
|
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(_Config) ->
|
||||||
|
emqx_ct_helpers:boot_modules(all),
|
||||||
emqx_ct_helpers:stop_apps([]).
|
emqx_ct_helpers:stop_apps([]).
|
||||||
|
|
||||||
t_compile_clientid_common_name_alias_placeholders(_Config) ->
|
t_compile_clientid_common_name_alias_placeholders(_Config) ->
|
||||||
|
|
|
@ -39,5 +39,6 @@ t_is_enabled(_) ->
|
||||||
ok = application:set_env(emqx, boot_modules, [router, broker, listeners]),
|
ok = application:set_env(emqx, boot_modules, [router, broker, listeners]),
|
||||||
?assert(emqx_boot:is_enabled(router)),
|
?assert(emqx_boot:is_enabled(router)),
|
||||||
?assert(emqx_boot:is_enabled(broker)),
|
?assert(emqx_boot:is_enabled(broker)),
|
||||||
?assert(emqx_boot:is_enabled(listeners)).
|
?assert(emqx_boot:is_enabled(listeners)),
|
||||||
|
ok = application:set_env(emqx, boot_modules, all).
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ set_special_cfg(PluginsDir) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(_Config) ->
|
||||||
|
emqx_ct_helpers:boot_modules(all),
|
||||||
emqx_ct_helpers:stop_apps([]),
|
emqx_ct_helpers:stop_apps([]),
|
||||||
file:delete(get(loaded_file)).
|
file:delete(get(loaded_file)).
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,13 @@ all() -> emqx_ct:all(?MODULE).
|
||||||
%% CT callbacks
|
%% CT callbacks
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
init_per_suite(Config) ->
|
||||||
|
emqx_ct_helpers:boot_modules(all),
|
||||||
|
Config.
|
||||||
|
|
||||||
|
end_per_suite(_Config) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
init_per_testcase(TestCase, Config) when
|
init_per_testcase(TestCase, Config) when
|
||||||
TestCase =/= t_ws_sub_protocols_mqtt_equivalents,
|
TestCase =/= t_ws_sub_protocols_mqtt_equivalents,
|
||||||
TestCase =/= t_ws_sub_protocols_mqtt,
|
TestCase =/= t_ws_sub_protocols_mqtt,
|
||||||
|
|
Loading…
Reference in New Issue