# 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)
63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { Page } from '@playwright/test';
|
|
import { clickButton, fillInInput, selectDropdownValue } from './forms';
|
|
import { goToOnCallPage } from './navigation';
|
|
import dayjs from 'dayjs';
|
|
|
|
export const createOnCallSchedule = async (page: Page, scheduleName: string, userName: string): Promise<void> => {
|
|
// go to the schedules page
|
|
await goToOnCallPage(page, 'schedules');
|
|
|
|
// create an oncall-rotation schedule
|
|
await clickButton({ page, buttonText: 'New Schedule' });
|
|
(await page.waitForSelector('button >> text=Create >> nth=0')).click();
|
|
|
|
// fill in the name input
|
|
await fillInInput(page, 'div[class*="ScheduleForm"] input[name="name"]', scheduleName);
|
|
|
|
// Add a new layer w/ the current user to it
|
|
await clickButton({ page, buttonText: 'Create Schedule' });
|
|
|
|
await clickButton({ page, buttonText: 'Add rotation' });
|
|
|
|
/**
|
|
* Drag the modal such that the "Create" button will always be visible within the viewport. We cannot scroll
|
|
* on the modal itself
|
|
* https://playwright.dev/docs/input#dragging-manually
|
|
*/
|
|
await page.locator('.ReactModal__Content .drag-handler').dragTo(page.locator('.page-header__logo'));
|
|
|
|
await selectDropdownValue({
|
|
page,
|
|
selectType: 'grafanaSelect',
|
|
placeholderText: 'Add user',
|
|
value: userName,
|
|
});
|
|
|
|
await clickButton({ page, buttonText: 'Create' });
|
|
};
|
|
|
|
export interface OverrideFormDateInputs {
|
|
start: dayjs.Dayjs;
|
|
end: dayjs.Dayjs;
|
|
}
|
|
|
|
export const getOverrideFormDateInputs = async (page: Page): Promise<OverrideFormDateInputs> => {
|
|
const getInputValue = async (inputNumber: number): Promise<string> => {
|
|
const element = await page.waitForSelector(`div[data-testid=\"override-inputs\"] >> input >> nth=${inputNumber}`);
|
|
return await element.inputValue();
|
|
};
|
|
|
|
const startDate = await getInputValue(0);
|
|
const startTime = await getInputValue(1);
|
|
|
|
const endDate = await getInputValue(2);
|
|
const endTime = await getInputValue(3);
|
|
|
|
const startDateTime = dayjs(`${startDate} ${startTime}`, 'MM/DD/YYYY HH:mm');
|
|
const endDateTime = dayjs(`${endDate} ${endTime}`, 'MM/DD/YYYY HH:mm');
|
|
|
|
return {
|
|
start: startDateTime,
|
|
end: endDateTime,
|
|
};
|
|
};
|