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:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: docker/metadata-action@v3
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - uses: docker/metadata-action@v4
 | 
			
		||||
        id: meta
 | 
			
		||||
        with:
 | 
			
		||||
          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:
 | 
			
		||||
          username: nim65s
 | 
			
		||||
          password: ${{ secrets.DOCKERHUB_TOKEN }}
 | 
			
		||||
      - uses: docker/build-push-action@v2
 | 
			
		||||
      - uses: docker/build-push-action@v3
 | 
			
		||||
        with:
 | 
			
		||||
          context: .
 | 
			
		||||
          push: true
 | 
			
		||||
          tags: ${{ steps.meta.outputs.tags }}
 | 
			
		||||
          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:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - uses: psf/black@stable
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								.github/workflows/release.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release.yml
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -9,7 +9,7 @@ jobs:
 | 
			
		|||
  release:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - run: pip install -U poetry twine wheel
 | 
			
		||||
      - run: poetry build
 | 
			
		||||
      - 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:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - 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:
 | 
			
		||||
-   repo: https://github.com/pre-commit/pre-commit-hooks
 | 
			
		||||
    rev: v4.0.1
 | 
			
		||||
    rev: v4.4.0
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: check-added-large-files
 | 
			
		||||
    -   id: check-ast
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ repos:
 | 
			
		|||
    -   id: mixed-line-ending
 | 
			
		||||
    -   id: trailing-whitespace
 | 
			
		||||
-   repo: https://github.com/psf/black
 | 
			
		||||
    rev: 21.12b0
 | 
			
		||||
    rev: 22.10.0
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: black
 | 
			
		||||
        language_version: python3
 | 
			
		||||
| 
						 | 
				
			
			@ -25,6 +25,12 @@ repos:
 | 
			
		|||
        args:
 | 
			
		||||
        - --ignore=D200,D203,D212
 | 
			
		||||
-   repo: https://github.com/PyCQA/flake8
 | 
			
		||||
    rev: 4.0.1
 | 
			
		||||
    rev: 6.0.0
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   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]
 | 
			
		||||
 | 
			
		||||
## [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
 | 
			
		||||
  in [#12](https://github.com/nim65s/matrix-webhook/pull/12)
 | 
			
		||||
  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
 | 
			
		||||
- 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.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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										20
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -4,9 +4,11 @@
 | 
			
		|||
[](https://github.com/nim65s/matrix-webhook/actions/workflows/lint.yml)
 | 
			
		||||
[](https://hub.docker.com/r/nim65s/matrix-webhook)
 | 
			
		||||
[](https://pypi.org/project/matrix-webhook/)
 | 
			
		||||
[](https://results.pre-commit.ci/latest/github/nim65s/matrix-webhook/main)
 | 
			
		||||
 | 
			
		||||
[](https://github.com/psf/black)
 | 
			
		||||
[](https://codecov.io/gh/nim65s/matrix-webhook)
 | 
			
		||||
[](https://codeclimate.com/github/nim65s/matrix-webhook/maintainability)
 | 
			
		||||
[](https://badge.fury.io/py/matrix-webhook)
 | 
			
		||||
 | 
			
		||||
Post a message to a matrix room with a simple HTTP POST
 | 
			
		||||
| 
						 | 
				
			
			@ -21,9 +23,12 @@ docker pull nim65s/matrix-webhook
 | 
			
		|||
 | 
			
		||||
## 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
 | 
			
		||||
# OR
 | 
			
		||||
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:
 | 
			
		||||
`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
 | 
			
		||||
 | 
			
		||||
[#matrix-webhook:tetaneutral.net](https://matrix.to/#/!DPrUlnwOhBEfYwsDLh:matrix.org)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,13 @@ import logging
 | 
			
		|||
 | 
			
		||||
from . import app, conf
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    """Start everything."""
 | 
			
		||||
    log_format = "%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s"
 | 
			
		||||
    logging.basicConfig(level=50 - 10 * conf.VERBOSE, format=log_format)
 | 
			
		||||
    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]
 | 
			
		||||
name = "matrix-webhook"
 | 
			
		||||
version = "3.2.1"
 | 
			
		||||
version = "3.5.0"
 | 
			
		||||
description = "Post a message to a matrix room with a simple HTTP POST"
 | 
			
		||||
authors = ["Guilhem Saurel <guilhem.saurel@laas.fr>"]
 | 
			
		||||
license = "BSD-2-Clause"
 | 
			
		||||
| 
						 | 
				
			
			@ -8,17 +8,21 @@ readme = "README.md"
 | 
			
		|||
homepage = "https://github.com/nim65s/matrix-webhook"
 | 
			
		||||
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]
 | 
			
		||||
python = "^3.8"
 | 
			
		||||
Markdown = "^3.3.4"
 | 
			
		||||
matrix-nio = "^0.18.3"
 | 
			
		||||
matrix-nio = ">=0.18.3,<0.21.0"
 | 
			
		||||
 | 
			
		||||
[tool.poetry.dev-dependencies]
 | 
			
		||||
httpx = "^0.18.2"
 | 
			
		||||
coverage = "^5.5"
 | 
			
		||||
black = "^21.6b0"
 | 
			
		||||
httpx = "^0.23.0"
 | 
			
		||||
black = "^22.8.0"
 | 
			
		||||
coverage = "^6.4.4"
 | 
			
		||||
pydocstyle = "^6.1.1"
 | 
			
		||||
flake8 = "^3.9.2"
 | 
			
		||||
flake8 = "^5.0.4"
 | 
			
		||||
pyupgrade = "^2.31.0"
 | 
			
		||||
 | 
			
		||||
[tool.pydocstyle]
 | 
			
		||||
ignore = ["D200", "D203", "D204", "D212"]
 | 
			
		||||
| 
						 | 
				
			
			@ -26,3 +30,6 @@ ignore = ["D200", "D203", "D204", "D212"]
 | 
			
		|||
[build-system]
 | 
			
		||||
requires = ["poetry-core>=1.0.0"]
 | 
			
		||||
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 . \
 | 
			
		||||
 && /start.py generate \
 | 
			
		||||
 && 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
 | 
			
		||||
 | 
			
		||||
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(),
 | 
			
		||||
            {"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…
	
	Add table
		Add a link
		
	
		Reference in a new issue