merge upstream changes
This commit is contained in:
commit
6781f994f9
21 changed files with 857 additions and 660 deletions
6
.github/dependabot.yml
vendored
Normal file
6
.github/dependabot.yml
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
13
.github/workflows/docker-hub.yml
vendored
13
.github/workflows/docker-hub.yml
vendored
|
@ -11,18 +11,23 @@ jobs:
|
||||||
docker-hub:
|
docker-hub:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: docker/metadata-action@v3
|
- uses: docker/metadata-action@v4
|
||||||
id: meta
|
id: meta
|
||||||
with:
|
with:
|
||||||
images: nim65s/matrix-webhook
|
images: nim65s/matrix-webhook
|
||||||
- uses: docker/login-action@v1
|
- uses: docker/setup-qemu-action@v2
|
||||||
|
name: Set up QEMU
|
||||||
|
- uses: docker/setup-buildx-action@v2
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
- uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
username: nim65s
|
username: nim65s
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
- uses: docker/build-push-action@v2
|
- uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
|
12
.github/workflows/entrypoint.yml
vendored
Normal file
12
.github/workflows/entrypoint.yml
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
name: Test entrypoints
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-python@v4
|
||||||
|
- run: python -m pip install -U pip
|
||||||
|
- run: python -m pip install .
|
||||||
|
- run: matrix-webhook -h
|
||||||
|
- run: python -m matrix_webhook -h
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
|
@ -4,5 +4,5 @@ jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: psf/black@stable
|
- uses: psf/black@stable
|
||||||
|
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
@ -9,7 +9,7 @@ jobs:
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- run: pip install -U poetry twine wheel
|
- run: pip install -U poetry twine wheel
|
||||||
- run: poetry build
|
- run: poetry build
|
||||||
- run: twine upload --non-interactive -u __token__ -p ${{ secrets.PYPI_TOKEN }} dist/*
|
- run: twine upload --non-interactive -u __token__ -p ${{ secrets.PYPI_TOKEN }} dist/*
|
||||||
|
|
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
|
@ -4,6 +4,6 @@ jobs:
|
||||||
tests:
|
tests:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- run: docker-compose -f test.yml up --exit-code-from tests
|
- run: docker-compose -f test.yml up --exit-code-from tests
|
||||||
- uses: codecov/codecov-action@v1
|
- uses: codecov/codecov-action@v3
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.0.1
|
rev: v4.4.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
- id: check-ast
|
- id: check-ast
|
||||||
|
@ -14,7 +14,7 @@ repos:
|
||||||
- id: mixed-line-ending
|
- id: mixed-line-ending
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 21.12b0
|
rev: 22.10.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
language_version: python3
|
language_version: python3
|
||||||
|
@ -25,6 +25,12 @@ repos:
|
||||||
args:
|
args:
|
||||||
- --ignore=D200,D203,D212
|
- --ignore=D200,D203,D212
|
||||||
- repo: https://github.com/PyCQA/flake8
|
- repo: https://github.com/PyCQA/flake8
|
||||||
rev: 4.0.1
|
rev: 6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: flake8
|
- id: flake8
|
||||||
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
|
rev: v3.2.2
|
||||||
|
hooks:
|
||||||
|
- id: pyupgrade
|
||||||
|
args:
|
||||||
|
- --py38-plus
|
||||||
|
|
31
CHANGELOG.md
31
CHANGELOG.md
|
@ -6,6 +6,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [v3.5.0] - 2022-09-07
|
||||||
|
|
||||||
|
- Add formatter for grafana 9
|
||||||
|
in [#45](https://github.com/nim65s/matrix-webhook/pull/45)
|
||||||
|
by [@svenseeberg](https://github.com/svenseeberg)
|
||||||
|
|
||||||
|
## [v3.4.0] - 2022-08-12
|
||||||
|
|
||||||
|
- fix tests
|
||||||
|
- add `matrix-webhook` script
|
||||||
|
in [#25](https://github.com/nim65s/matrix-webhook/pull/25)
|
||||||
|
and [#35](https://github.com/nim65s/matrix-webhook/pull/35)
|
||||||
|
by [@a7p](https://github.com/a7p)
|
||||||
|
- publish linux/arm64 image
|
||||||
|
in [#37](https://github.com/nim65s/matrix-webhook/pull/35)
|
||||||
|
by [@kusold](https://github.com/kusold)
|
||||||
|
- update badges
|
||||||
|
- setup dependabot
|
||||||
|
- misc upgrades from poetry update, pre-commit.ci, and dependabot
|
||||||
|
|
||||||
|
## [v3.3.0] - 2022-03-04
|
||||||
|
|
||||||
|
- add pyupgrade
|
||||||
|
- add gitlab formatter for google chat & microsoft teams
|
||||||
|
in [#21](https://github.com/nim65s/matrix-webhook/pull/21)
|
||||||
|
by [@GhislainC](https://github.com/GhislainC)
|
||||||
- join room before sending message
|
- join room before sending message
|
||||||
in [#12](https://github.com/nim65s/matrix-webhook/pull/12)
|
in [#12](https://github.com/nim65s/matrix-webhook/pull/12)
|
||||||
by [@bboehmke](https://github.com/bboehmke)
|
by [@bboehmke](https://github.com/bboehmke)
|
||||||
|
@ -64,7 +90,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
## [v1.0.0] - 2020-02-14
|
## [v1.0.0] - 2020-02-14
|
||||||
- First release with matrix-client & http.server
|
- First release with matrix-client & http.server
|
||||||
|
|
||||||
[Unreleased]: https://github.com/nim65s/matrix-webhook/compare/v3.2.1...master
|
[Unreleased]: https://github.com/nim65s/matrix-webhook/compare/v3.5.0...master
|
||||||
|
[v3.5.0]: https://github.com/nim65s/matrix-webhook/compare/v3.4.0...v3.5.0
|
||||||
|
[v3.4.0]: https://github.com/nim65s/matrix-webhook/compare/v3.3.0...v3.4.0
|
||||||
|
[v3.3.0]: https://github.com/nim65s/matrix-webhook/compare/v3.2.1...v3.3.0
|
||||||
[v3.2.1]: https://github.com/nim65s/matrix-webhook/compare/v3.2.0...v3.2.1
|
[v3.2.1]: https://github.com/nim65s/matrix-webhook/compare/v3.2.0...v3.2.1
|
||||||
[v3.2.0]: https://github.com/nim65s/matrix-webhook/compare/v3.1.1...v3.2.0
|
[v3.2.0]: https://github.com/nim65s/matrix-webhook/compare/v3.1.1...v3.2.0
|
||||||
[v3.1.1]: https://github.com/nim65s/matrix-webhook/compare/v3.1.0...v3.1.1
|
[v3.1.1]: https://github.com/nim65s/matrix-webhook/compare/v3.1.0...v3.1.1
|
||||||
|
|
20
README.md
20
README.md
|
@ -4,9 +4,11 @@
|
||||||
[![Lints](https://github.com/nim65s/matrix-webhook/actions/workflows/lint.yml/badge.svg)](https://github.com/nim65s/matrix-webhook/actions/workflows/lint.yml)
|
[![Lints](https://github.com/nim65s/matrix-webhook/actions/workflows/lint.yml/badge.svg)](https://github.com/nim65s/matrix-webhook/actions/workflows/lint.yml)
|
||||||
[![Docker-Hub](https://github.com/nim65s/matrix-webhook/actions/workflows/docker-hub.yml/badge.svg)](https://hub.docker.com/r/nim65s/matrix-webhook)
|
[![Docker-Hub](https://github.com/nim65s/matrix-webhook/actions/workflows/docker-hub.yml/badge.svg)](https://hub.docker.com/r/nim65s/matrix-webhook)
|
||||||
[![Release](https://github.com/nim65s/matrix-webhook/actions/workflows/release.yml/badge.svg)](https://pypi.org/project/matrix-webhook/)
|
[![Release](https://github.com/nim65s/matrix-webhook/actions/workflows/release.yml/badge.svg)](https://pypi.org/project/matrix-webhook/)
|
||||||
|
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/nim65s/matrix-webhook/master.svg)](https://results.pre-commit.ci/latest/github/nim65s/matrix-webhook/main)
|
||||||
|
|
||||||
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
|
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
|
||||||
[![codecov](https://codecov.io/gh/nim65s/matrix-webhook/branch/master/graph/badge.svg?token=BLGISGCYKG)](https://codecov.io/gh/nim65s/matrix-webhook)
|
[![codecov](https://codecov.io/gh/nim65s/matrix-webhook/branch/master/graph/badge.svg?token=BLGISGCYKG)](https://codecov.io/gh/nim65s/matrix-webhook)
|
||||||
|
[![Maintainability](https://api.codeclimate.com/v1/badges/a0783da8c0461fe95eaf/maintainability)](https://codeclimate.com/github/nim65s/matrix-webhook/maintainability)
|
||||||
[![PyPI version](https://badge.fury.io/py/matrix-webhook.svg)](https://badge.fury.io/py/matrix-webhook)
|
[![PyPI version](https://badge.fury.io/py/matrix-webhook.svg)](https://badge.fury.io/py/matrix-webhook)
|
||||||
|
|
||||||
Post a message to a matrix room with a simple HTTP POST
|
Post a message to a matrix room with a simple HTTP POST
|
||||||
|
@ -21,9 +23,12 @@ docker pull nim65s/matrix-webhook
|
||||||
|
|
||||||
## Start
|
## Start
|
||||||
|
|
||||||
Create a matrix user for the bot, and launch this app it with the following arguments or environment variables:
|
Create a matrix user for the bot, and launch this app with the following arguments and/or environment variables
|
||||||
|
(environment variables update defaults, arguments take precedence):
|
||||||
|
|
||||||
```
|
```
|
||||||
|
matrix-webhook -h
|
||||||
|
# OR
|
||||||
python -m matrix_webhook -h
|
python -m matrix_webhook -h
|
||||||
# OR
|
# OR
|
||||||
docker run --rm -it nim65s/matrix-webhook -h
|
docker run --rm -it nim65s/matrix-webhook -h
|
||||||
|
@ -104,6 +109,19 @@ These formatters will output custom messages depending on the specific formatter
|
||||||
For example, if your matrix-webhook was hosted at https://webhooks.example.com, and you were setting up pingdom and you have an api_key of "123", you would use the following URL for your webhook call from pingdom:
|
For example, if your matrix-webhook was hosted at https://webhooks.example.com, and you were setting up pingdom and you have an api_key of "123", you would use the following URL for your webhook call from pingdom:
|
||||||
`https://webhooks.example.com/?formatter=pingdom&api_key=123`
|
`https://webhooks.example.com/?formatter=pingdom&api_key=123`
|
||||||
|
|
||||||
|
### For Gitlab
|
||||||
|
|
||||||
|
At a group level, Gitlab does not permit to setup webhooks. A workaround consists to use Google
|
||||||
|
Chat or Microsoft Teams notification integration with a custom URL (Gitlab does not check if the url begins with the normal url of the service).
|
||||||
|
|
||||||
|
#### Google Chat
|
||||||
|
|
||||||
|
Add a Google Chat integration with an URL ending with `?formatter=gitlab_gchat&key=API_KEY`
|
||||||
|
|
||||||
|
#### Microsoft Teams
|
||||||
|
|
||||||
|
Add a Microsoft Teams integration with an URL ending with `?formatter=gitlab_teams&key=API_KEY`
|
||||||
|
|
||||||
## Test room
|
## Test room
|
||||||
|
|
||||||
[#matrix-webhook:tetaneutral.net](https://matrix.to/#/!DPrUlnwOhBEfYwsDLh:matrix.org)
|
[#matrix-webhook:tetaneutral.net](https://matrix.to/#/!DPrUlnwOhBEfYwsDLh:matrix.org)
|
||||||
|
|
|
@ -3,7 +3,13 @@ import logging
|
||||||
|
|
||||||
from . import app, conf
|
from . import app, conf
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
def main():
|
||||||
|
"""Start everything."""
|
||||||
log_format = "%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s"
|
log_format = "%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s"
|
||||||
logging.basicConfig(level=50 - 10 * conf.VERBOSE, format=log_format)
|
logging.basicConfig(level=50 - 10 * conf.VERBOSE, format=log_format)
|
||||||
app.run()
|
app.run()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
1117
poetry.lock
generated
1117
poetry.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "matrix-webhook"
|
name = "matrix-webhook"
|
||||||
version = "3.2.1"
|
version = "3.5.0"
|
||||||
description = "Post a message to a matrix room with a simple HTTP POST"
|
description = "Post a message to a matrix room with a simple HTTP POST"
|
||||||
authors = ["Guilhem Saurel <guilhem.saurel@laas.fr>"]
|
authors = ["Guilhem Saurel <guilhem.saurel@laas.fr>"]
|
||||||
license = "BSD-2-Clause"
|
license = "BSD-2-Clause"
|
||||||
|
@ -8,17 +8,21 @@ readme = "README.md"
|
||||||
homepage = "https://github.com/nim65s/matrix-webhook"
|
homepage = "https://github.com/nim65s/matrix-webhook"
|
||||||
repository = "https://github.com/nim65s/matrix-webhook.git"
|
repository = "https://github.com/nim65s/matrix-webhook.git"
|
||||||
|
|
||||||
|
[tool.poetry.urls]
|
||||||
|
"changelog" = "https://github.com/nim65s/matrix-webhook/blob/master/CHANGELOG.md"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.8"
|
python = "^3.8"
|
||||||
Markdown = "^3.3.4"
|
Markdown = "^3.3.4"
|
||||||
matrix-nio = "^0.18.3"
|
matrix-nio = ">=0.18.3,<0.21.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
httpx = "^0.18.2"
|
httpx = "^0.23.0"
|
||||||
coverage = "^5.5"
|
black = "^22.8.0"
|
||||||
black = "^21.6b0"
|
coverage = "^6.4.4"
|
||||||
pydocstyle = "^6.1.1"
|
pydocstyle = "^6.1.1"
|
||||||
flake8 = "^3.9.2"
|
flake8 = "^5.0.4"
|
||||||
|
pyupgrade = "^2.31.0"
|
||||||
|
|
||||||
[tool.pydocstyle]
|
[tool.pydocstyle]
|
||||||
ignore = ["D200", "D203", "D204", "D212"]
|
ignore = ["D200", "D203", "D204", "D212"]
|
||||||
|
@ -26,3 +30,6 @@ ignore = ["D200", "D203", "D204", "D212"]
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
[tool.poetry.scripts]
|
||||||
|
matrix-webhook = "matrix_webhook.__main__:main"
|
||||||
|
|
|
@ -11,6 +11,22 @@ WORKDIR $SYNAPSE_CONFIG_DIR
|
||||||
RUN chown -R 991:991 . \
|
RUN chown -R 991:991 . \
|
||||||
&& /start.py generate \
|
&& /start.py generate \
|
||||||
&& sed -i 's=/data=/srv=;s=8008=80=;s=#sup=sup=;' homeserver.yaml \
|
&& sed -i 's=/data=/srv=;s=8008=80=;s=#sup=sup=;' homeserver.yaml \
|
||||||
|
&& echo "" >> homeserver.yaml \
|
||||||
|
&& echo "rc_message:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
|
&& echo "rc_registration:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
|
&& echo "rc_registration_token_validity:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
|
&& echo "rc_login:" >> homeserver.yaml \
|
||||||
|
&& echo " address:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
|
&& echo " account:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
|
&& echo " failed_attempts:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
|
&& echo "rc_joins:" >> homeserver.yaml \
|
||||||
|
&& echo " burst_count: 1000" >> homeserver.yaml \
|
||||||
&& python -m synapse.app.homeserver --config-path homeserver.yaml --generate-keys
|
&& python -m synapse.app.homeserver --config-path homeserver.yaml --generate-keys
|
||||||
|
|
||||||
RUN pip install --no-cache-dir markdown matrix-nio httpx coverage
|
RUN pip install --no-cache-dir markdown matrix-nio httpx coverage
|
||||||
|
|
1
tests/example_gitlab_gchat.json
Normal file
1
tests/example_gitlab_gchat.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"text":"John Doe pushed to branch \u003chttps://gitlab.com/jdoe/test/commits/master|master\u003e of \u003chttps://gitlab.com/jdoe/test|John Doe / test\u003e (\u003chttps://gitlab.com/jdoe/test/compare/b76004b20503d4d506e51a670de095cc063e4707...3517b06c64c9d349e2213650d6c009db0471361e|Compare changes\u003e)\n\u003chttps://gitlab.com/jdoe/test/-/commit/3517b06c64c9d349e2213650d6c009db0471361e|3517b06c\u003e: Merge branch 'prod' into 'master' - John Doe\n\n\u003chttps://gitlab.com/jdoe/test/-/commit/1f661795b220c5fe352f391eb8de3ac4fcc6fc1d|1f661795\u003e: Merge branch 'revert-a827b196' into 'prod' - John Doe\n\n\u003chttps://gitlab.com/jdoe/test/-/commit/b76004b20503d4d506e51a670de095cc063e4707|b76004b2\u003e: Merge branch 'revert-a827b196' into 'master' - John Doe"}
|
1
tests/example_gitlab_teams.json
Normal file
1
tests/example_gitlab_teams.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"sections":[{"activityTitle":"John Doe pushed to branch [master](https://gitlab.com/jdoe/test/commits/master)","activitySubtitle":"in [John Doe / test](https://gitlab.com/jdoe/test)","activityText":"[Compare changes](https://gitlab.com/jdoe/test/compare/b76004b20503d4d506e51a670de095cc063e4707...3517b06c64c9d349e2213650d6c009db0471361e)","activityImage":"https://secure.gravatar.com/avatar/80\u0026d=identicon"},{"text":"[3517b06c](https://gitlab.com/jdoe/test/-/commit/3517b06c64c9d349e2213650d6c009db0471361e): Merge branch 'prod' into 'master' - John Doe\n\n[1f661795](https://gitlab.com/jdoe/test/-/commit/1f661795b220c5fe352f391eb8de3ac4fcc6fc1d): Merge branch 'revert-a827b196' into 'prod' - John Doe\n\n[b76004b2](https://gitlab.com/jdoe/test/-/commit/b76004b20503d4d506e51a670de095cc063e4707): Merge branch 'revert-a827b196' into 'master' - John Doe"}],"title":"John Doe / test","summary":"John Doe pushed to branch [master](https://gitlab.com/jdoe/test/commits/master) of [John Doe / test](https://gitlab.com/jdoe/test) ([Compare changes](https://gitlab.com/jdoe/test/compare/b76004b20503d4d506e51a670de095cc063e4707...3517b06c64c9d349e2213650d6c009db0471361e))"}
|
41
tests/example_grafana_9x.json
Normal file
41
tests/example_grafana_9x.json
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
"receiver": "",
|
||||||
|
"status": "firing",
|
||||||
|
"alerts": [
|
||||||
|
{
|
||||||
|
"status": "firing",
|
||||||
|
"labels": {
|
||||||
|
"alertname": "TestAlert",
|
||||||
|
"instance": "Grafana"
|
||||||
|
},
|
||||||
|
"annotations": {
|
||||||
|
"summary": "Notification test"
|
||||||
|
},
|
||||||
|
"startsAt": "2022-09-07T15:00:26.722304913+02:00",
|
||||||
|
"endsAt": "0001-01-01T00:00:00Z",
|
||||||
|
"generatorURL": "",
|
||||||
|
"fingerprint": "57c6d9296de2ad39",
|
||||||
|
"silenceURL": "https://grafana.example.com/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DTestAlert&matcher=instance%3DGrafana",
|
||||||
|
"dashboardURL": "",
|
||||||
|
"panelURL": "",
|
||||||
|
"valueString": "[ metric='foo' labels={instance=bar} value=10 ]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"groupLabels": {},
|
||||||
|
"commonLabels": {
|
||||||
|
"alertname": "TestAlert",
|
||||||
|
"instance": "Grafana"
|
||||||
|
},
|
||||||
|
"commonAnnotations": {
|
||||||
|
"summary": "Notification test"
|
||||||
|
},
|
||||||
|
"externalURL": "https://grafana.example.com/",
|
||||||
|
"version": "1",
|
||||||
|
"groupKey": "{alertname=\"TestAlert\", instance=\"Grafana\"}2022-09-07 15:00:26.722304913 +0200 CEST m=+246580.963796811",
|
||||||
|
"truncatedAlerts": 0,
|
||||||
|
"orgId": 1,
|
||||||
|
"title": "[FIRING:1] (TestAlert Grafana)",
|
||||||
|
"state": "alerting",
|
||||||
|
"message": "**Firing**\n\nValue: [ metric='foo' labels={instance=bar} value=10 ]\nLabels:\n - alertname = TestAlert\n - instance = Grafana\nAnnotations:\n - summary = Notification test\nSilence: https://grafana.example.com/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DTestAlert&matcher=instance%3DGrafana\n",
|
||||||
|
"key": "ak"
|
||||||
|
}
|
|
@ -127,3 +127,4 @@ class GithubFormatterTest(unittest.IsolatedAsyncioTestCase):
|
||||||
).json(),
|
).json(),
|
||||||
{"status": 401, "ret": "Invalid SHA-256 HMAC digest"},
|
{"status": 401, "ret": "Invalid SHA-256 HMAC digest"},
|
||||||
)
|
)
|
||||||
|
await client.close()
|
||||||
|
|
54
tests/test_gitlab_gchat.py
Normal file
54
tests/test_gitlab_gchat.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
"""
|
||||||
|
Test module for gitlab "google chat" formatter.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
import nio
|
||||||
|
|
||||||
|
from .start import BOT_URL, FULL_ID, KEY, MATRIX_ID, MATRIX_PW, MATRIX_URL
|
||||||
|
|
||||||
|
|
||||||
|
class GitlabGchatFormatterTest(unittest.IsolatedAsyncioTestCase):
|
||||||
|
"""Gitlab "google chat" formatter test class."""
|
||||||
|
|
||||||
|
async def test_gitlab_gchat_body(self):
|
||||||
|
"""Send a markdown message, and check the result."""
|
||||||
|
messages = []
|
||||||
|
client = nio.AsyncClient(MATRIX_URL, MATRIX_ID)
|
||||||
|
|
||||||
|
await client.login(MATRIX_PW)
|
||||||
|
room = await client.room_create()
|
||||||
|
|
||||||
|
with open("tests/example_gitlab_gchat.json") as f:
|
||||||
|
example_gitlab_gchat_request = f.read()
|
||||||
|
self.assertEqual(
|
||||||
|
httpx.post(
|
||||||
|
f"{BOT_URL}/{room.room_id}",
|
||||||
|
params={"formatter": "gitlab_gchat", "key": KEY},
|
||||||
|
content=example_gitlab_gchat_request,
|
||||||
|
).json(),
|
||||||
|
{"status": 200, "ret": "OK"},
|
||||||
|
)
|
||||||
|
|
||||||
|
sync = await client.sync()
|
||||||
|
messages = await client.room_messages(room.room_id, sync.next_batch)
|
||||||
|
await client.close()
|
||||||
|
|
||||||
|
message = messages.chunk[0]
|
||||||
|
self.assertEqual(message.sender, FULL_ID)
|
||||||
|
self.assertEqual(
|
||||||
|
message.body,
|
||||||
|
"John Doe pushed to branch [master](https://gitlab.com/jdoe/test/commits/m"
|
||||||
|
+ "aster) of [John Doe / test](https://gitlab.com/jdoe/test) ([Compare chan"
|
||||||
|
+ "ges](https://gitlab.com/jdoe/test/compare/b76004b20503d4d506e51a670de095"
|
||||||
|
+ "cc063e4707...3517b06c64c9d349e2213650d6c009db0471361e))\n[3517b06c](http"
|
||||||
|
+ "s://gitlab.com/jdoe/test/-/commit/3517b06c64c9d349e2213650d6c009db047136"
|
||||||
|
+ "1e): Merge branch 'prod' into 'master' - John Doe\n\n[1f661795](https://"
|
||||||
|
+ "gitlab.com/jdoe/test/-/commit/1f661795b220c5fe352f391eb8de3ac4fcc6fc1d):"
|
||||||
|
+ " Merge branch 'revert-a827b196' into 'prod' - John Doe\n\n[b76004b2](htt"
|
||||||
|
+ "ps://gitlab.com/jdoe/test/-/commit/b76004b20503d4d506e51a670de095cc063e4"
|
||||||
|
+ "707): Merge branch 'revert-a827b196' into 'master' - John Doe",
|
||||||
|
)
|
55
tests/test_gitlab_teams.py
Normal file
55
tests/test_gitlab_teams.py
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
"""
|
||||||
|
Test module for gitlab "teams" formatter.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
import nio
|
||||||
|
|
||||||
|
from .start import BOT_URL, FULL_ID, KEY, MATRIX_ID, MATRIX_PW, MATRIX_URL
|
||||||
|
|
||||||
|
|
||||||
|
class GitlabTeamsFormatterTest(unittest.IsolatedAsyncioTestCase):
|
||||||
|
"""Gitlab "teams" formatter test class."""
|
||||||
|
|
||||||
|
async def test_gitlab_teams_body(self):
|
||||||
|
"""Send a markdown message, and check the result."""
|
||||||
|
messages = []
|
||||||
|
client = nio.AsyncClient(MATRIX_URL, MATRIX_ID)
|
||||||
|
|
||||||
|
await client.login(MATRIX_PW)
|
||||||
|
room = await client.room_create()
|
||||||
|
|
||||||
|
with open("tests/example_gitlab_teams.json") as f:
|
||||||
|
example_gitlab_teams_request = f.read()
|
||||||
|
self.assertEqual(
|
||||||
|
httpx.post(
|
||||||
|
f"{BOT_URL}/{room.room_id}",
|
||||||
|
params={"formatter": "gitlab_teams", "key": KEY},
|
||||||
|
content=example_gitlab_teams_request,
|
||||||
|
).json(),
|
||||||
|
{"status": 200, "ret": "OK"},
|
||||||
|
)
|
||||||
|
|
||||||
|
sync = await client.sync()
|
||||||
|
messages = await client.room_messages(room.room_id, sync.next_batch)
|
||||||
|
await client.close()
|
||||||
|
|
||||||
|
message = messages.chunk[0]
|
||||||
|
self.assertEqual(message.sender, FULL_ID)
|
||||||
|
self.assertEqual(
|
||||||
|
message.body,
|
||||||
|
"John Doe pushed to branch [master](https://gitlab.com/jdoe/test/commits"
|
||||||
|
+ "/master) in [John Doe / test](https://gitlab.com/jdoe/test) \u2192 [Com"
|
||||||
|
+ "pare changes](https://gitlab.com/jdoe/test/compare/b76004b20503d4d506e5"
|
||||||
|
+ "1a670de095cc063e4707...3517b06c64c9d349e2213650d6c009db0471361e) \n\n*"
|
||||||
|
+ " [3517b06c](https://gitlab.com/jdoe/test/-/commit/3517b06c64c9d349e2213"
|
||||||
|
+ "650d6c009db0471361e): Merge branch 'prod' into 'master' - John Doe \n*"
|
||||||
|
+ " [1f661795](https://gitlab.com/jdoe/test/-/commit/1f661795b220c5fe352f3"
|
||||||
|
+ "91eb8de3ac4fcc6fc1d): Merge branch 'revert-a827b196' into 'prod' - John"
|
||||||
|
+ " Doe \n* [b76004b2](https://gitlab.com/jdoe/test/-/commit/b76004b20503"
|
||||||
|
+ "d4d506e51a670de095cc063e4707): Merge branch 'revert-a827b196' into 'mas"
|
||||||
|
+ "ter' - John Doe",
|
||||||
|
)
|
51
tests/test_grafana_9x.py
Normal file
51
tests/test_grafana_9x.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
"""
|
||||||
|
Test module for grafana v9 formatter.
|
||||||
|
|
||||||
|
ref https://grafana.com/docs/grafana/latest/alerting/old-alerting/notifications/#webhook
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
import nio
|
||||||
|
|
||||||
|
from .start import BOT_URL, FULL_ID, MATRIX_ID, MATRIX_PW, MATRIX_URL
|
||||||
|
|
||||||
|
|
||||||
|
class Grafana9xFormatterTest(unittest.IsolatedAsyncioTestCase):
|
||||||
|
"""Grafana formatter test class."""
|
||||||
|
|
||||||
|
async def test_grafana_body(self):
|
||||||
|
"""Send a markdown message, and check the result."""
|
||||||
|
messages = []
|
||||||
|
client = nio.AsyncClient(MATRIX_URL, MATRIX_ID)
|
||||||
|
|
||||||
|
await client.login(MATRIX_PW)
|
||||||
|
room = await client.room_create()
|
||||||
|
|
||||||
|
with open("tests/example_grafana_9x.json") as f:
|
||||||
|
example_grafana_request = f.read()
|
||||||
|
self.assertEqual(
|
||||||
|
httpx.post(
|
||||||
|
f"{BOT_URL}/{room.room_id}",
|
||||||
|
params={"formatter": "grafana_9x"},
|
||||||
|
content=example_grafana_request,
|
||||||
|
).json(),
|
||||||
|
{"status": 200, "ret": "OK"},
|
||||||
|
)
|
||||||
|
|
||||||
|
sync = await client.sync()
|
||||||
|
messages = await client.room_messages(room.room_id, sync.next_batch)
|
||||||
|
await client.close()
|
||||||
|
|
||||||
|
message = messages.chunk[0]
|
||||||
|
self.assertEqual(message.sender, FULL_ID)
|
||||||
|
expected_body = (
|
||||||
|
"#### [FIRING:1] (TestAlert Grafana)\n**Firing**\n\n\n\nValue: [ metr"
|
||||||
|
"ic='foo' labels={instance=bar} value=10 ]\n\nLabels:\n\n - alertname "
|
||||||
|
"= TestAlert\n\n - instance = Grafana\n\nAnnotations:\n\n - summary = "
|
||||||
|
"Notification test\n\nSilence: https://grafana.example.com/alerting/si"
|
||||||
|
"lence/new?alertmanager=grafana&matcher=alertname%3DTestAlert&matcher="
|
||||||
|
"instance%3DGrafana\n\n\n\n"
|
||||||
|
)
|
||||||
|
self.assertEqual(message.body, expected_body)
|
51
tests/test_grafana_forward.py
Normal file
51
tests/test_grafana_forward.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
"""
|
||||||
|
Test version 9 compatibility of grafana formatter.
|
||||||
|
|
||||||
|
ref https://grafana.com/docs/grafana/latest/alerting/old-alerting/notifications/#webhook
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
import nio
|
||||||
|
|
||||||
|
from .start import BOT_URL, FULL_ID, MATRIX_ID, MATRIX_PW, MATRIX_URL
|
||||||
|
|
||||||
|
|
||||||
|
class GrafanaForwardFormatterTest(unittest.IsolatedAsyncioTestCase):
|
||||||
|
"""Grafana formatter test class."""
|
||||||
|
|
||||||
|
async def test_grafana_body(self):
|
||||||
|
"""Send a markdown message, and check the result."""
|
||||||
|
messages = []
|
||||||
|
client = nio.AsyncClient(MATRIX_URL, MATRIX_ID)
|
||||||
|
|
||||||
|
await client.login(MATRIX_PW)
|
||||||
|
room = await client.room_create()
|
||||||
|
|
||||||
|
with open("tests/example_grafana_9x.json") as f:
|
||||||
|
example_grafana_request = f.read()
|
||||||
|
self.assertEqual(
|
||||||
|
httpx.post(
|
||||||
|
f"{BOT_URL}/{room.room_id}",
|
||||||
|
params={"formatter": "grafana"},
|
||||||
|
content=example_grafana_request,
|
||||||
|
).json(),
|
||||||
|
{"status": 200, "ret": "OK"},
|
||||||
|
)
|
||||||
|
|
||||||
|
sync = await client.sync()
|
||||||
|
messages = await client.room_messages(room.room_id, sync.next_batch)
|
||||||
|
await client.close()
|
||||||
|
|
||||||
|
message = messages.chunk[0]
|
||||||
|
self.assertEqual(message.sender, FULL_ID)
|
||||||
|
expected_body = (
|
||||||
|
"#### [FIRING:1] (TestAlert Grafana)\n**Firing**\n\n\n\nValue: [ metr"
|
||||||
|
"ic='foo' labels={instance=bar} value=10 ]\n\nLabels:\n\n - alertname "
|
||||||
|
"= TestAlert\n\n - instance = Grafana\n\nAnnotations:\n\n - summary = "
|
||||||
|
"Notification test\n\nSilence: https://grafana.example.com/alerting/si"
|
||||||
|
"lence/new?alertmanager=grafana&matcher=alertname%3DTestAlert&matcher="
|
||||||
|
"instance%3DGrafana\n\n\n\n"
|
||||||
|
)
|
||||||
|
self.assertEqual(message.body, expected_body)
|
Loading…
Reference in a new issue