Fix bugs in web title and message templates rendering and visual representation (#1747)

# What this PR does

## Which issue(s) this PR fixes

## Checklist

- [ ] Unit, integration, and e2e (if applicable) tests updated
- [ ] Documentation added (or `pr:no public docs` PR label added if not
required)
- [ ] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
This commit is contained in:
Ildar Iskhakov 2023-05-02 16:57:52 +08:00 committed by GitHub
parent 071e3c6b1b
commit 14b692674a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 41 additions and 127 deletions

View file

@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Add filter descriptions to web ui by @iskhakov ([1845](https://github.com/grafana/oncall/pull/1845))
### Fixed
- Fix bugs in web title and message templates rendering and visual representation ([1747](https://github.com/grafana/oncall/pull/1747))
## v1.2.16 (2023-04-27)
### Added

View file

@ -63,6 +63,10 @@ def test_default_templates(
)
rendered_attr = getattr(rendered_alert, attr)
print(f"{alert_receive_channel}'s {notification_channel} {attr} ")
print(rendered_attr)
print()
print("====================================")
assert rendered_attr == expected, (
f"{alert_receive_channel}'s {notification_channel} {attr} " f"is not equal to expected"
)

View file

@ -168,13 +168,14 @@ def convert_md_to_html(text):
# This gives us <pre> and <code> tags for ```-fenced blocks
"fenced-code-blocks",
"pyshell",
"nl2br",
"target-blank-links",
"nofollow",
"pymdownx.emoji",
"pymdownx.magiclink",
"tables",
],
).strip()
# Special handling cases for lists
text = text.replace("\n\n<ul>", "<ul>")
text = text.replace("\n<li>", "<li>")
# Special handling cases for newlines
text = text.replace("\n", "<br/>")
return text

View file

@ -149,21 +149,18 @@ tests = {
},
"web": {
"title": "KubeJobCompletion",
"message": (
"<p>"
"<strong>Status</strong>: firing<br/>"
"<strong>Labels:</strong> <br/>"
"<em>job</em>: kube-state-metrics<br/>"
"<em>instance</em>: 10.143.139.7:8443<br/>"
"<em>job_name</em>: email-tracking-perform-initialization-1.0.50<br/>"
"<em>severity</em>: warning<br/><em>alertname</em>: KubeJobCompletion<br/>"
"<em>namespace</em>: default<br/><em>prometheus</em>: monitoring/k8s<br/>"
"<strong>Annotations:</strong><br/>"
"<em>message</em>: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete. <br/>"
"<em>runbook_url</em>: "
'<a href="https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion">here</a>'
"</p>"
),
"message": """<p><strong>Status</strong>: firing
<strong>Labels:</strong>
<em>job</em>: kube-state-metrics
<em>instance</em>: 10.143.139.7:8443
<em>job_name</em>: email-tracking-perform-initialization-1.0.50
<em>severity</em>: warning
<em>alertname</em>: KubeJobCompletion
<em>namespace</em>: default
<em>prometheus</em>: monitoring/k8s
<strong>Annotations:</strong>
<em>message</em>: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete.
<em>runbook_url</em>: <a href="https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion" rel="nofollow noopener" target="_blank">here</a></p>""", # noqa
"image_url": None,
},
"sms": {

View file

@ -169,21 +169,19 @@ tests = {
},
"web": {
"title": "KubeJobCompletion",
"message": (
"<p>"
"<strong>Status</strong>: firing<br/>"
"<strong>Labels:</strong> <br/>"
"<em>job</em>: kube-state-metrics<br/>"
"<em>instance</em>: 10.143.139.7:8443<br/>"
"<em>job_name</em>: email-tracking-perform-initialization-1.0.50<br/>"
"<em>severity</em>: warning<br/><em>alertname</em>: KubeJobCompletion<br/>"
"<em>namespace</em>: default<br/><em>prometheus</em>: monitoring/k8s<br/>"
"<strong>Annotations:</strong><br/>"
"<em>message</em>: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete. <br/>"
"<em>runbook_url</em>: "
'<a href="https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion">here</a>'
"</p>"
),
"message": """\
<p><strong>Status</strong>: firing
<strong>Labels:</strong>
<em>job</em>: kube-state-metrics
<em>instance</em>: 10.143.139.7:8443
<em>job_name</em>: email-tracking-perform-initialization-1.0.50
<em>severity</em>: warning
<em>alertname</em>: KubeJobCompletion
<em>namespace</em>: default
<em>prometheus</em>: monitoring/k8s
<strong>Annotations:</strong>
<em>message</em>: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete.
<em>runbook_url</em>: <a href="https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion" rel="nofollow noopener" target="_blank">here</a></p>""", # noqa
"image_url": None,
},
"sms": {

View file

@ -104,97 +104,6 @@ resolve_condition = """\
acknowledge_condition = None
tests = {
"payload": {
"endsAt": "0001-01-01T00:00:00Z",
"labels": {
"job": "kube-state-metrics",
"instance": "10.143.139.7:8443",
"job_name": "email-tracking-perform-initialization-1.0.50",
"severity": "warning",
"alertname": "KubeJobCompletion",
"namespace": "default",
"prometheus": "monitoring/k8s",
},
"status": "firing",
"startsAt": "2019-12-13T08:57:35.095800493Z",
"annotations": {
"message": "Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete.",
"runbook_url": "https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion",
},
"generatorURL": (
"https://localhost/prometheus/graph?g0.expr=kube_job_spec_completions%7Bjob%3D%22kube-state-metrics%22%7D+-+"
"kube_job_status_succeeded%7Bjob%3D%22kube-state-metrics%22%7D+%3E+0&g0.tab=1"
),
},
"slack": {
"title": (
"*<{web_link}|#1 KubeJobCompletion>* via {integration_name} (*<"
"https://localhost/prometheus/graph?g0.expr=kube_job_spec_completions%7Bjob%3D%22kube-state-metrics%22%7D+-+"
"kube_job_status_succeeded%7Bjob%3D%22kube-state-metrics%22%7D+%3E+0&g0.tab=1"
"|source>*)"
),
"message": (
"*Status*: firing\n"
"*Labels:* \n"
"job: kube-state-metrics\n"
"instance: 10.143.139.7:8443\n"
"job_name: email-tracking-perform-initialization-1.0.50\n"
"severity: warning\n"
"alertname: KubeJobCompletion\n"
"namespace: default\n"
"prometheus: monitoring/k8s\n"
"*Annotations:*\n"
"message: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete. \n"
"runbook_url: <https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion|here> "
),
"image_url": None,
},
"web": {
"title": "KubeJobCompletion",
"message": (
"<p>"
"<strong>Status</strong>: firing<br/>"
"<strong>Labels:</strong> <br/>"
"<em>job</em>: kube-state-metrics<br/>"
"<em>instance</em>: 10.143.139.7:8443<br/>"
"<em>job_name</em>: email-tracking-perform-initialization-1.0.50<br/>"
"<em>severity</em>: warning<br/><em>alertname</em>: KubeJobCompletion<br/>"
"<em>namespace</em>: default<br/><em>prometheus</em>: monitoring/k8s<br/>"
"<strong>Annotations:</strong><br/>"
"<em>message</em>: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete. <br/>"
"<em>runbook_url</em>: "
'<a href="https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion">here</a>'
"</p>"
),
"image_url": None,
},
"sms": {
"title": "KubeJobCompletion",
},
"phone_call": {
"title": "KubeJobCompletion",
},
"telegram": {
"title": "KubeJobCompletion",
"message": (
"<b>Status</b>: firing\n"
"<b>Labels:</b> \n"
"job: kube-state-metrics\n"
"instance: 10.143.139.7:8443\n"
"job_name: email-tracking-perform-initialization-1.0.50\n"
"severity: warning\n"
"alertname: KubeJobCompletion\n"
"namespace: default\n"
"prometheus: monitoring/k8s\n"
"<b>Annotations:</b>\n"
"message: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete.\n\n"
"runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion\n"
),
"image_url": None,
},
}
example_payload = {
"receiver": "amixr",
"status": "firing",

View file

@ -52,3 +52,4 @@ django-dbconn-retry==0.1.7
django-ipware==4.0.2
django-anymail==8.6
django-deprecate-fields==0.1.1
pymdown-extensions==9.11

View file

@ -3,7 +3,7 @@ import dompurify from 'dompurify';
export default function sanitize(str: string): string {
return dompurify.sanitize(str, {
USE_PROFILES: { html: true },
FORBID_TAGS: ['form', 'input', 'pre'],
FORBID_TAGS: ['form', 'input'],
ADD_ATTR: ['target'],
});
}