2022-06-03 08:09:47 -06:00
|
|
|
{
|
|
|
|
|
"name": "grafana-oncall-app",
|
2023-07-26 18:57:57 +08:00
|
|
|
"version": "dev-oss",
|
2022-06-03 08:09:47 -06:00
|
|
|
"description": "Grafana OnCall Plugin",
|
|
|
|
|
"scripts": {
|
2023-11-17 11:07:12 +01:00
|
|
|
"lint": "eslint --cache --ext .js,.jsx,.ts,.tsx --max-warnings=0 ./src ./e2e-tests",
|
Webhook labels (#3383)
This PR add labels for webhooks.
1. Make webhook "labelable" with ability to filter by labels.
2. Add labels to the webhook payload. It contain new field webhook with
it's name, id and labels. Field integration and alert_group has a
corresponding label field as well. See example of a new payload below:
```
{
"event": {
"type": "escalation"
},
"user": null,
"alert_group": {
"id": "IRFN6ZD31N31B",
"integration_id": "CTWM7U4A2QG97",
"route_id": "RUE7U7Z46SKGY",
"alerts_count": 1,
"state": "firing",
"created_at": "2023-11-22T08:54:55.178243Z",
"resolved_at": null,
"acknowledged_at": null,
"title": "Incident",
"permalinks": {
"slack": null,
"telegram": null,
"web": "http://grafana:3000/a/grafana-oncall-app/alert-groups/IRFN6ZD31N31B"
},
"labels": {
"severity": "critical"
}
},
"alert_group_id": "IRFN6ZD31N31B",
"alert_payload": {
"message": "This alert was sent by user for demonstration purposes"
},
"integration": {
"id": "CTWM7U4A2QG97",
"type": "webhook",
"name": "hi - Webhook",
"team": null,
"labels": {
"hello": "world",
"severity": "critical"
}
},
"notified_users": [],
"users_to_be_notified": [],
"webhook": {
"id": "WHAXK4BTC7TAEQ",
"name": "test",
"labels": {
"hello": "kesha"
}
}
}
```
I feel that there is an opportunity to make code cleaner - remove all
label logic from serializers, views and utils to models or dedicated
LabelerService and introduce Labelable interface with something like
label_verbal, update_labels methods. However, I don't want to tie
webhook labels with a refactoring.
---------
Co-authored-by: Dominik <dominik.broj@grafana.com>
2023-11-22 19:17:41 +08:00
|
|
|
"lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --quiet ./src ./e2e-tests",
|
2022-11-02 11:44:42 +00:00
|
|
|
"stylelint": "stylelint ./src/**/*.{css,scss,module.css,module.scss}",
|
|
|
|
|
"stylelint:fix": "stylelint --fix ./src/**/*.{css,scss,module.css,module.scss}",
|
2022-06-03 08:09:47 -06:00
|
|
|
"build": "grafana-toolkit plugin:build",
|
2022-11-07 16:34:43 +01:00
|
|
|
"build:dev": "grafana-toolkit plugin:build --skipTest --skipLint",
|
2023-11-29 06:40:19 +01:00
|
|
|
"labels:link": "yarn --cwd ../../gops-labels/frontend link && yarn link \"@grafana/labels\" && yarn --cwd ../../gops-labels/frontend watch",
|
|
|
|
|
"labels:unlink": "yarn --cwd ../../gops-labels/frontend unlink",
|
2022-10-12 14:05:26 +03:00
|
|
|
"test": "jest --verbose",
|
2023-01-30 13:34:35 +03:00
|
|
|
"test:silent": "jest --silent",
|
fix a few flaky e2e tests + allow running project locally via k8s/helm (#2751)
# What this PR does
- updates the GitHub Actions workflow to move the e2e tests into a
"[reusable
workflow](https://docs.github.com/en/actions/using-workflows/reusing-workflows#creating-a-reusable-workflow)"
which are run in two scenarios:
- all tests _except_ those annotated as `@expensive` are run against
`grafana/grafana:latest` on all feature branches
- all tests _including_ `@expensive` tests are run on weekdays @ 07h00
UTC, against a matrix of 6 grafana versions. Results of these builds
will be posted to `#irm-amixr-flux` Slack channel.
- local development will now be:
```bash
make build-dev-images init-k8s start-k8s
```
- `build-dev-images` - builds the engine and UI docker images (only need
to run first time)
- `init-k8s` - creates a `kind` cluster and loads the two Docker images
onto the cluster nodes (only need to run first time)
- `start-k8s` - switches `kubectl` context to the created `kind`
cluster, and uses `helm` to deploy everything as defined in
`./dev/helm-local.yml` and `./dev/helm-local.dev.yml` (that latter file
is `.gitignored` and specific to how _you_ want your setup to look like.
Hot reloading works as before. This is the _start_ of #2381. (I've
marked these `make` commands as beta, because they've not yet been
thoroughly tested for local development).
- modifies the `helm` chart to add the concept of `oncall.devMode`,
`ui`, and ability to run oncall w/ sqlite
- `oncall.devMode` will essentially just add `volumes` and
`volumeMounts` to the various engine/migrate containers +
- `ui.enabled` + `ui.env` - create a ui container (which is needed for
hot reloading locally)
- `sqlite` - this was useful for the e2e test environments where Github
runner resources are scarce. Running `mariadb` eats up precious
resources, instead lets just use sqlite here
- fixes an issue that caused sporadic HTTP 502s from the grafana
plugin-proxy, which led to flaky tests. See [this
comment](https://github.com/grafana/oncall/pull/2751/files#diff-09040e8df192699b9c5742110ebbe8d9d5c3938cb156cc1cb99fa1c3fdee4fefR72-R77)
for more context + a link to a relevant Slack conversation. **tldr;**
there is a bug with the Grafana plugin proxy in Grafana >= v10.0.3.
Let's stop using the `latest`/`main` docker tags in our test and pin to
`10.0.2` for now
- ~~re-enables the e2e test which validates a phone number via SMS, and
asserts that we can receive an alert escalation via SMS (new Mailslurp
API Key has been added as a repo secret)~~ update: this is still blocked
by procurement, will be done in a future PR
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-08-22 19:03:29 +02:00
|
|
|
"test:e2e": "yarn playwright test --grep-invert @expensive",
|
|
|
|
|
"test:e2e-expensive": "yarn playwright test --grep @expensive",
|
2023-11-10 11:54:22 -05:00
|
|
|
"test:e2e:watch": "yarn test:e2e --ui",
|
|
|
|
|
"test:e2e:gen": "yarn playwright codegen http://localhost:3000",
|
fix a few flaky e2e tests + allow running project locally via k8s/helm (#2751)
# What this PR does
- updates the GitHub Actions workflow to move the e2e tests into a
"[reusable
workflow](https://docs.github.com/en/actions/using-workflows/reusing-workflows#creating-a-reusable-workflow)"
which are run in two scenarios:
- all tests _except_ those annotated as `@expensive` are run against
`grafana/grafana:latest` on all feature branches
- all tests _including_ `@expensive` tests are run on weekdays @ 07h00
UTC, against a matrix of 6 grafana versions. Results of these builds
will be posted to `#irm-amixr-flux` Slack channel.
- local development will now be:
```bash
make build-dev-images init-k8s start-k8s
```
- `build-dev-images` - builds the engine and UI docker images (only need
to run first time)
- `init-k8s` - creates a `kind` cluster and loads the two Docker images
onto the cluster nodes (only need to run first time)
- `start-k8s` - switches `kubectl` context to the created `kind`
cluster, and uses `helm` to deploy everything as defined in
`./dev/helm-local.yml` and `./dev/helm-local.dev.yml` (that latter file
is `.gitignored` and specific to how _you_ want your setup to look like.
Hot reloading works as before. This is the _start_ of #2381. (I've
marked these `make` commands as beta, because they've not yet been
thoroughly tested for local development).
- modifies the `helm` chart to add the concept of `oncall.devMode`,
`ui`, and ability to run oncall w/ sqlite
- `oncall.devMode` will essentially just add `volumes` and
`volumeMounts` to the various engine/migrate containers +
- `ui.enabled` + `ui.env` - create a ui container (which is needed for
hot reloading locally)
- `sqlite` - this was useful for the e2e test environments where Github
runner resources are scarce. Running `mariadb` eats up precious
resources, instead lets just use sqlite here
- fixes an issue that caused sporadic HTTP 502s from the grafana
plugin-proxy, which led to flaky tests. See [this
comment](https://github.com/grafana/oncall/pull/2751/files#diff-09040e8df192699b9c5742110ebbe8d9d5c3938cb156cc1cb99fa1c3fdee4fefR72-R77)
for more context + a link to a relevant Slack conversation. **tldr;**
there is a bug with the Grafana plugin proxy in Grafana >= v10.0.3.
Let's stop using the `latest`/`main` docker tags in our test and pin to
`10.0.2` for now
- ~~re-enables the e2e test which validates a phone number via SMS, and
asserts that we can receive an alert escalation via SMS (new Mailslurp
API Key has been added as a repo secret)~~ update: this is still blocked
by procurement, will be done in a future PR
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-08-22 19:03:29 +02:00
|
|
|
"e2e-show-report": "yarn playwright show-report",
|
2023-11-29 06:16:13 +01:00
|
|
|
"generate-types": "cd ./src/network/oncall-api/types-generator && yarn generate",
|
2022-06-03 08:09:47 -06:00
|
|
|
"dev": "grafana-toolkit plugin:dev",
|
|
|
|
|
"watch": "grafana-toolkit plugin:dev --watch",
|
|
|
|
|
"sign": "grafana-toolkit plugin:sign",
|
|
|
|
|
"ci-build:finish": "grafana-toolkit plugin:ci-build --finish",
|
|
|
|
|
"ci-package": "grafana-toolkit plugin:ci-package",
|
|
|
|
|
"ci-report": "grafana-toolkit plugin:ci-report",
|
|
|
|
|
"start": "yarn watch",
|
|
|
|
|
"plop": "plop",
|
|
|
|
|
"setversion": "setversion"
|
|
|
|
|
},
|
|
|
|
|
"repository": {
|
|
|
|
|
"type": "git",
|
|
|
|
|
"url": "git+https://github.com/grafana/oncall.git"
|
|
|
|
|
},
|
|
|
|
|
"lint-staged": {
|
|
|
|
|
"*.ts?(x)": [
|
|
|
|
|
"prettier --write",
|
|
|
|
|
"eslint --fix"
|
|
|
|
|
],
|
|
|
|
|
"*.js?(x)": [
|
|
|
|
|
"prettier --write",
|
|
|
|
|
"eslint --fix"
|
|
|
|
|
],
|
|
|
|
|
"*.css": [
|
|
|
|
|
"stylelint --fix"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"author": "Grafana Labs",
|
|
|
|
|
"license": "Apache-2.0",
|
|
|
|
|
"devDependencies": {
|
2022-12-22 13:38:47 +02:00
|
|
|
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
|
|
|
|
"@babel/plugin-proposal-decorators": "^7.20.0",
|
|
|
|
|
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
|
|
|
|
|
"@babel/plugin-proposal-object-rest-spread": "^7.18.9",
|
|
|
|
|
"@babel/plugin-proposal-optional-chaining": "^7.18.9",
|
|
|
|
|
"@babel/plugin-syntax-decorators": "^7.18.6",
|
|
|
|
|
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
|
|
|
|
"@babel/plugin-transform-destructuring": "^7.20.0",
|
|
|
|
|
"@babel/plugin-transform-react-constant-elements": "^7.18.12",
|
|
|
|
|
"@babel/plugin-transform-runtime": "^7.19.6",
|
|
|
|
|
"@babel/plugin-transform-typescript": "^7.18.12",
|
2022-12-22 15:06:55 +02:00
|
|
|
"@babel/preset-env": "^7.18.10",
|
|
|
|
|
"@babel/preset-react": "^7.18.6",
|
|
|
|
|
"@babel/preset-typescript": "^7.18.6",
|
2023-05-17 22:12:51 +02:00
|
|
|
"@grafana/eslint-config": "^5.1.0",
|
|
|
|
|
"@grafana/toolkit": "^9.5.2",
|
2022-11-16 11:56:54 +02:00
|
|
|
"@jest/globals": "^27.5.1",
|
2023-11-17 11:07:12 +01:00
|
|
|
"@playwright/test": "^1.39.0",
|
2022-10-07 14:56:13 +03:00
|
|
|
"@testing-library/jest-dom": "^5.16.5",
|
|
|
|
|
"@testing-library/react": "12",
|
2022-11-21 16:26:00 +01:00
|
|
|
"@testing-library/user-event": "^14.4.3",
|
2022-08-25 19:31:42 +03:00
|
|
|
"@types/dompurify": "^2.3.4",
|
2022-11-03 16:58:34 +02:00
|
|
|
"@types/jest": "27.5.1",
|
2022-08-25 19:31:42 +03:00
|
|
|
"@types/lodash-es": "^4.17.6",
|
first UI integration test - phone verification + receive SMS alert flow (#900)
**What this PR does**:
Adds our first UI integration test using
[Playwright](https://playwright.dev/) and runs the test on CI. Right now
the test:
- logs into Grafana
- configures the plugin (if it isn't already)
- creates an OnCall schedule, where the current user will be OnCall
- creates an escalation chain to notify based on the newly created
OnCall schedule
- creates a webhook integration, attached to the created escalation
chain
- sends a demo alert for the new integration
- goes to the alert groups page and validates that the escalation step
to alert the OnCall user actually happened
Currently the Playwright tests are run against the 3 default headless
browsers, chromium, Firefox, and webkit. The CI job that runs these
tests is run as a matrix against 3 tagged versions of `grafana`; `main`,
`latest`, and `9.2.6`.
Secondly, it adds most of the logic for a second test which:
- logs into Grafana
- configures the plugin (if it isn't already)
- goes to the user's settings, verifies their phone number (using a tool
called [MailSlurp](https://www.mailslurp.com/))
- configures the current user's default escalation policy to send alerts
via SMS
- creates an escalation policy and configures it to send alerts to our
current user
- creates an integration and assigns the created escalation policy
- triggers a test alert + verifies that we receive the SMS alert text
(again, using MailSlurp)
**Which issue(s) this PR fixes**:
Closes #873
**Checklist**
- [x] Tests updated
- [ ] Documentation added (N/A)
- [ ] `CHANGELOG.md` updated (N/A)
2023-03-06 17:28:52 +01:00
|
|
|
"@types/node": "^18.11.9",
|
2022-11-21 16:26:00 +01:00
|
|
|
"@types/query-string": "^6.3.0",
|
2022-08-25 19:31:42 +03:00
|
|
|
"@types/react-copy-to-clipboard": "^5.0.4",
|
|
|
|
|
"@types/react-dom": "^18.0.6",
|
|
|
|
|
"@types/react-responsive": "^8.0.5",
|
|
|
|
|
"@types/react-router-dom": "^5.3.3",
|
2022-10-13 16:04:03 +03:00
|
|
|
"@types/react-test-renderer": "^17.0.2",
|
2022-11-21 16:26:00 +01:00
|
|
|
"@types/react-transition-group": "^4.4.5",
|
2022-08-25 19:31:42 +03:00
|
|
|
"@types/throttle-debounce": "^5.0.0",
|
2022-10-24 14:27:03 +02:00
|
|
|
"@typescript-eslint/eslint-plugin": "^5.40.1",
|
2022-11-03 16:58:34 +02:00
|
|
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
2022-08-25 19:31:42 +03:00
|
|
|
"copy-webpack-plugin": "^11.0.0",
|
|
|
|
|
"dompurify": "^2.3.12",
|
2022-12-15 17:47:30 +02:00
|
|
|
"dotenv": "^16.0.3",
|
2022-10-24 14:27:03 +02:00
|
|
|
"eslint": "^8.25.0",
|
2023-05-17 22:12:51 +02:00
|
|
|
"eslint-plugin-jsdoc": "^44.2.4",
|
2022-10-24 14:27:03 +02:00
|
|
|
"eslint-plugin-react": "^7.31.10",
|
|
|
|
|
"eslint-plugin-react-hooks": "^4.6.0",
|
2022-06-03 08:09:47 -06:00
|
|
|
"eslint-plugin-rulesdir": "^0.2.1",
|
2022-11-03 16:58:34 +02:00
|
|
|
"jest": "27.5.1",
|
|
|
|
|
"jest-environment-jsdom": "^27.5.1",
|
2022-06-03 08:09:47 -06:00
|
|
|
"lint-staged": "^10.2.11",
|
2022-08-25 19:31:42 +03:00
|
|
|
"lodash-es": "^4.17.21",
|
first UI integration test - phone verification + receive SMS alert flow (#900)
**What this PR does**:
Adds our first UI integration test using
[Playwright](https://playwright.dev/) and runs the test on CI. Right now
the test:
- logs into Grafana
- configures the plugin (if it isn't already)
- creates an OnCall schedule, where the current user will be OnCall
- creates an escalation chain to notify based on the newly created
OnCall schedule
- creates a webhook integration, attached to the created escalation
chain
- sends a demo alert for the new integration
- goes to the alert groups page and validates that the escalation step
to alert the OnCall user actually happened
Currently the Playwright tests are run against the 3 default headless
browsers, chromium, Firefox, and webkit. The CI job that runs these
tests is run as a matrix against 3 tagged versions of `grafana`; `main`,
`latest`, and `9.2.6`.
Secondly, it adds most of the logic for a second test which:
- logs into Grafana
- configures the plugin (if it isn't already)
- goes to the user's settings, verifies their phone number (using a tool
called [MailSlurp](https://www.mailslurp.com/))
- configures the current user's default escalation policy to send alerts
via SMS
- creates an escalation policy and configures it to send alerts to our
current user
- creates an integration and assigns the created escalation policy
- triggers a test alert + verifies that we receive the SMS alert text
(again, using MailSlurp)
**Which issue(s) this PR fixes**:
Closes #873
**Checklist**
- [x] Tests updated
- [ ] Documentation added (N/A)
- [ ] `CHANGELOG.md` updated (N/A)
2023-03-06 17:28:52 +01:00
|
|
|
"mailslurp-client": "^15.14.1",
|
2022-08-25 19:31:42 +03:00
|
|
|
"moment-timezone": "^0.5.35",
|
2023-11-29 06:16:13 +01:00
|
|
|
"openapi-typescript": "^7.0.0-next.4",
|
2022-06-03 08:09:47 -06:00
|
|
|
"plop": "^2.7.4",
|
2022-08-26 12:26:33 +03:00
|
|
|
"postcss-loader": "^7.0.1",
|
2022-11-03 16:20:20 +02:00
|
|
|
"react": "17.0.2",
|
|
|
|
|
"react-dom": "17.0.2",
|
2022-10-13 16:04:03 +03:00
|
|
|
"react-test-renderer": "^17.0.2",
|
2022-10-24 14:27:03 +02:00
|
|
|
"stylelint-config-prettier": "^9.0.3",
|
|
|
|
|
"stylelint-prettier": "^2.0.0",
|
2022-11-03 16:20:20 +02:00
|
|
|
"ts-jest": "29.0.3",
|
2022-08-25 19:31:42 +03:00
|
|
|
"ts-loader": "^9.3.1",
|
2023-11-29 06:16:13 +01:00
|
|
|
"ts-node": "^10.9.1",
|
2022-10-24 14:27:03 +02:00
|
|
|
"typescript": "4.6.4",
|
2022-08-25 19:31:42 +03:00
|
|
|
"webpack-bundle-analyzer": "^4.6.1"
|
2022-06-03 08:09:47 -06:00
|
|
|
},
|
|
|
|
|
"engines": {
|
|
|
|
|
"node": ">=14"
|
|
|
|
|
},
|
|
|
|
|
"dependencies": {
|
2022-12-20 17:47:22 +02:00
|
|
|
"@grafana/data": "^9.2.4",
|
|
|
|
|
"@grafana/faro-web-sdk": "^1.0.0-beta4",
|
|
|
|
|
"@grafana/faro-web-tracing": "^1.0.0-beta4",
|
2023-11-27 17:53:54 +00:00
|
|
|
"@grafana/labels": "1.3.4",
|
2022-12-20 17:47:22 +02:00
|
|
|
"@grafana/runtime": "9.3.0-beta1",
|
2023-05-03 16:51:45 +02:00
|
|
|
"@grafana/ui": "^9.4.7",
|
2022-12-09 11:02:06 +02:00
|
|
|
"@opentelemetry/api": "^1.3.0",
|
2022-06-17 12:19:34 +03:00
|
|
|
"array-move": "^4.0.0",
|
2022-06-03 08:09:47 -06:00
|
|
|
"change-case": "^4.1.1",
|
|
|
|
|
"circular-dependency-plugin": "^5.2.2",
|
2022-09-07 16:05:19 +03:00
|
|
|
"dayjs": "^1.11.5",
|
2022-06-03 08:09:47 -06:00
|
|
|
"eslint-plugin-import": "^2.25.4",
|
2022-08-25 19:31:42 +03:00
|
|
|
"mobx": "5.13.0",
|
|
|
|
|
"mobx-react": "6.1.1",
|
2023-01-31 20:00:14 +03:00
|
|
|
"object-hash": "^3.0.0",
|
2023-11-29 06:16:13 +01:00
|
|
|
"openapi-fetch": "^0.8.1",
|
2023-01-09 17:50:55 +02:00
|
|
|
"prettier": "^2.8.2",
|
2023-11-14 15:28:05 +01:00
|
|
|
"qrcode.react": "^3.1.0",
|
2023-02-24 13:14:45 +02:00
|
|
|
"raw-loader": "^4.0.2",
|
2022-06-03 08:09:47 -06:00
|
|
|
"rc-table": "^7.17.1",
|
|
|
|
|
"react-copy-to-clipboard": "^5.0.2",
|
2022-06-17 12:19:34 +03:00
|
|
|
"react-draggable": "^4.4.5",
|
2022-06-03 08:09:47 -06:00
|
|
|
"react-emoji-render": "^1.2.4",
|
2022-06-17 12:19:34 +03:00
|
|
|
"react-modal": "^3.15.1",
|
2022-06-03 08:09:47 -06:00
|
|
|
"react-responsive": "^8.1.0",
|
2023-01-18 13:11:59 +03:00
|
|
|
"react-router-dom": "5.3.3",
|
2022-06-03 08:09:47 -06:00
|
|
|
"react-sortable-hoc": "^1.11.0",
|
|
|
|
|
"react-string-replace": "^0.4.4",
|
2022-08-29 13:19:56 +03:00
|
|
|
"react-transition-group": "^4.4.5",
|
2022-09-07 16:05:19 +03:00
|
|
|
"sass-loader": "^13.0.2",
|
2022-06-03 08:09:47 -06:00
|
|
|
"stylelint": "^13.13.1",
|
|
|
|
|
"stylelint-config-standard": "^22.0.0",
|
|
|
|
|
"throttle-debounce": "^2.1.0"
|
|
|
|
|
}
|
|
|
|
|
}
|