Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
17ef8a7
Add email connector
shahzad31 Jan 24, 2022
1888961
PR feedback
shahzad31 Jan 24, 2022
35ae6aa
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 24, 2022
8a81dfe
fix tests
shahzad31 Jan 24, 2022
ac8a078
fix tests
shahzad31 Jan 24, 2022
152cbdc
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 25, 2022
85e0e3c
fix types
shahzad31 Jan 25, 2022
c1d76b4
fix test
shahzad31 Jan 25, 2022
4e77d2e
fix more types
shahzad31 Jan 25, 2022
fc47eb0
update
shahzad31 Jan 25, 2022
2c00e94
fix a bug
shahzad31 Jan 25, 2022
50afd44
Merge branch 'main' into email-connector
kibanamachine Jan 25, 2022
3321381
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 25, 2022
a283b4c
remove flag
shahzad31 Jan 25, 2022
5151d00
Merge branch 'email-connector' of github.com:shahzad31/kibana into em…
shahzad31 Jan 25, 2022
5788927
fix cc/bcc
shahzad31 Jan 25, 2022
0d921f1
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 26, 2022
c600b3e
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 27, 2022
eb5a7a4
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 27, 2022
bc44876
update type
shahzad31 Jan 27, 2022
5741d39
update type
shahzad31 Jan 27, 2022
20e4b12
Merge branch 'main' of github.com:elastic/kibana into email-connector
shahzad31 Jan 27, 2022
8d8d823
fix flixkering
shahzad31 Jan 27, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion x-pack/plugins/translations/translations/ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -27232,7 +27232,6 @@
"xpack.uptime.alerts.monitorStatus.timerangeValueField.expression": "within",
"xpack.uptime.alerts.monitorStatus.timerangeValueField.value": "最終{value}",
"xpack.uptime.alerts.searchPlaceholder.kql": "KQL構文を使用してフィルタリング",
"xpack.uptime.alerts.settings.createConnector": "コネクターを作成",
"xpack.uptime.alerts.timerangeUnitSelectable.daysOption.ariaLabel": "「日」の時間範囲選択項目",
"xpack.uptime.alerts.timerangeUnitSelectable.hoursOption.ariaLabel": "「時間」の時間範囲選択項目",
"xpack.uptime.alerts.timerangeUnitSelectable.minutesOption.ariaLabel": "「分」の時間範囲選択項目",
Expand Down
1 change: 0 additions & 1 deletion x-pack/plugins/translations/translations/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -27702,7 +27702,6 @@
"xpack.uptime.alerts.monitorStatus.timerangeValueField.expression": "之内",
"xpack.uptime.alerts.monitorStatus.timerangeValueField.value": "上一 {value}",
"xpack.uptime.alerts.searchPlaceholder.kql": "使用 kql 语法筛选",
"xpack.uptime.alerts.settings.createConnector": "创建连接器",
"xpack.uptime.alerts.timerangeUnitSelectable.daysOption.ariaLabel": "“天”时间范围选择项",
"xpack.uptime.alerts.timerangeUnitSelectable.hoursOption.ariaLabel": "“小时”时间范围选择项",
"xpack.uptime.alerts.timerangeUnitSelectable.minutesOption.ariaLabel": "“分钟”时间范围选择项",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ export const EmailParamsFields = ({
errors,
messageVariables,
defaultMessage,
isLoading,
isDisabled,
showEmailSubjectAndMessage = true,
}: ActionParamsProps<EmailActionParams>) => {
const { to, cc, bcc, subject, message } = actionParams;
const toOptions = to ? to.map((label: string) => ({ label })) : [];
Expand Down Expand Up @@ -65,15 +68,15 @@ export const EmailParamsFields = ({
labelAppend={
<>
<span>
{!addCC ? (
{!addCC && (!cc || cc?.length === 0) ? (
<EuiButtonEmpty size="xs" onClick={() => setAddCC(true)}>
<FormattedMessage
defaultMessage="Cc"
id="xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.addCcButton"
/>
</EuiButtonEmpty>
) : null}
{!addBCC ? (
{!addBCC && (!bcc || bcc?.length === 0) ? (
<EuiButtonEmpty size="xs" onClick={() => setAddBCC(true)}>
<FormattedMessage
defaultMessage="Bcc"
Expand All @@ -88,6 +91,8 @@ export const EmailParamsFields = ({
<EuiComboBox
noSuggestions
isInvalid={isToInvalid}
isLoading={isLoading}
isDisabled={isDisabled}
fullWidth
data-test-subj="toEmailAddressInput"
selectedOptions={toOptions}
Expand All @@ -113,11 +118,12 @@ export const EmailParamsFields = ({
}}
/>
</EuiFormRow>
{addCC ? (
{addCC || (cc && cc?.length > 0) ? (
<EuiFormRow
fullWidth
error={errors.cc}
isInvalid={isCCInvalid}
isDisabled={isDisabled}
label={i18n.translate(
'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientCopyTextFieldLabel',
{
Expand All @@ -128,6 +134,7 @@ export const EmailParamsFields = ({
<EuiComboBox
noSuggestions
isInvalid={isCCInvalid}
isLoading={isLoading}
fullWidth
data-test-subj="ccEmailAddressInput"
selectedOptions={ccOptions}
Expand All @@ -154,7 +161,7 @@ export const EmailParamsFields = ({
/>
</EuiFormRow>
) : null}
{addBCC ? (
{addBCC || (bcc && bcc?.length > 0) ? (
<EuiFormRow
fullWidth
error={errors.bcc}
Expand All @@ -169,6 +176,8 @@ export const EmailParamsFields = ({
<EuiComboBox
noSuggestions
isInvalid={isBCCInvalid}
isDisabled={isDisabled}
isLoading={isLoading}
fullWidth
data-test-subj="bccEmailAddressInput"
selectedOptions={bccOptions}
Expand All @@ -195,40 +204,44 @@ export const EmailParamsFields = ({
/>
</EuiFormRow>
) : null}
<EuiFormRow
fullWidth
error={errors.subject}
isInvalid={isSubjectInvalid}
label={i18n.translate(
'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel',
{
defaultMessage: 'Subject',
}
)}
>
<TextFieldWithMessageVariables
{showEmailSubjectAndMessage && (
<EuiFormRow
fullWidth
error={errors.subject}
isInvalid={isSubjectInvalid}
label={i18n.translate(
'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel',
{
defaultMessage: 'Subject',
}
)}
>
<TextFieldWithMessageVariables
index={index}
editAction={editAction}
messageVariables={messageVariables}
paramsProperty={'subject'}
inputTargetValue={subject}
errors={(errors.subject ?? []) as string[]}
/>
</EuiFormRow>
)}
{showEmailSubjectAndMessage && (
<TextAreaWithMessageVariables
index={index}
editAction={editAction}
messageVariables={messageVariables}
paramsProperty={'subject'}
inputTargetValue={subject}
errors={(errors.subject ?? []) as string[]}
paramsProperty={'message'}
inputTargetValue={message}
label={i18n.translate(
'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.messageTextAreaFieldLabel',
{
defaultMessage: 'Message',
}
)}
errors={(errors.message ?? []) as string[]}
/>
</EuiFormRow>
<TextAreaWithMessageVariables
index={index}
editAction={editAction}
messageVariables={messageVariables}
paramsProperty={'message'}
inputTargetValue={message}
label={i18n.translate(
'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.messageTextAreaFieldLabel',
{
defaultMessage: 'Message',
}
)}
errors={(errors.message ?? []) as string[]}
/>
)}
</>
);
};
Expand Down
3 changes: 3 additions & 0 deletions x-pack/plugins/triggers_actions_ui/public/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ export interface ActionParamsProps<TParams> {
messageVariables?: ActionVariable[];
defaultMessage?: string;
actionConnector?: ActionConnector;
isLoading?: boolean;
isDisabled?: boolean;
showEmailSubjectAndMessage?: boolean;
}

export interface Pagination {
Expand Down
28 changes: 22 additions & 6 deletions x-pack/plugins/uptime/common/runtime_types/dynamic_settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,27 @@

import * as t from 'io-ts';

export const DynamicSettingsType = t.strict({
heartbeatIndices: t.string,
certAgeThreshold: t.number,
certExpirationThreshold: t.number,
defaultConnectors: t.array(t.string),
});
const DefaultEmailType = t.intersection([
t.type({
to: t.array(t.string),
}),
t.partial({
cc: t.array(t.string),
bcc: t.array(t.string),
}),
]);

export const DynamicSettingsType = t.intersection([
t.strict({
heartbeatIndices: t.string,
certAgeThreshold: t.number,
certExpirationThreshold: t.number,
defaultConnectors: t.array(t.string),
}),
t.partial({
defaultEmail: DefaultEmailType,
}),
]);

export const DynamicSettingsSaveType = t.intersection([
t.type({
Expand All @@ -24,4 +39,5 @@ export const DynamicSettingsSaveType = t.intersection([
]);

export type DynamicSettings = t.TypeOf<typeof DynamicSettingsType>;
export type DefaultEmail = t.TypeOf<typeof DefaultEmailType>;
export type DynamicSettingsSaveResponse = t.TypeOf<typeof DynamicSettingsSaveType>;
102 changes: 102 additions & 0 deletions x-pack/plugins/uptime/e2e/journeys/alerts/default_email_settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import { journey, step, before } from '@elastic/synthetics';
import {
assertNotText,
assertText,
byTestId,
loginToKibana,
waitForLoadingToFinish,
} from '../utils';
import { settingsPageProvider } from '../../page_objects/settings';

journey('DefaultEmailSettings', async ({ page, params }) => {
const settings = settingsPageProvider({ page, kibanaUrl: params.kibanaUrl });

before(async () => {
await waitForLoadingToFinish({ page });
});

const queryParams = new URLSearchParams({
dateRangeStart: '2021-11-21T22:06:06.502Z',
dateRangeEnd: '2021-11-21T22:10:08.203Z',
}).toString();

const baseUrl = `${params.kibanaUrl}/app/uptime/settings`;

step('Go to uptime', async () => {
await page.goto(`${baseUrl}?${queryParams}`, {
waitUntil: 'networkidle',
});
await loginToKibana({ page });
});

step('clear existing settings', async () => {
await settings.dismissSyntheticsCallout();
await page.waitForSelector(byTestId('"default-connectors-input-loaded"'));
await page.waitForTimeout(10 * 1000);
const toEmailInput = await page.$(byTestId('toEmailAddressInput'));

if (toEmailInput !== null) {
await page.click(`${byTestId('toEmailAddressInput')} >> ${byTestId('comboBoxClearButton')}`);
await page.click(
`${byTestId('"default-connectors-input-loaded"')} >> ${byTestId('comboBoxClearButton')}`
);
await settings.saveSettings();
}
});

step('Add email connector', async () => {
await page.click(byTestId('createConnectorButton'));
await page.click(byTestId('".email-card"'));
await page.fill(byTestId('nameInput'), 'Test connector');
await page.fill(byTestId('emailFromInput'), 'test@gmail.com');

await page.selectOption(byTestId('emailServiceSelectInput'), 'other');
await page.fill(byTestId('emailHostInput'), 'test');
await page.fill(byTestId('emailPortInput'), '1025');
await page.click('text=Require authentication for this server');
await page.click(byTestId('saveNewActionButton'));
});

step('Select email connector', async () => {
await assertNotText({ page, text: 'Bcc' });
await page.click(byTestId('default-connectors-input-loaded'));
await page.click(byTestId('"Test connector"'));

await assertText({ page, text: 'Bcc' });

await settings.assertText({ text: 'To email is required for email connector' });

await settings.assertApplyDisabled();

await settings.fillToEmail('test@gmail.com');

await settings.assertApplyEnabled();
});

step('Checks for invalid email', async () => {
await settings.fillToEmail('test@gmail');

await settings.assertText({ text: 'test@gmail is not a valid email.' });

await settings.assertApplyDisabled();
await settings.removeInvalidEmail('test@gmail');
});

step('Save settings', async () => {
await settings.saveSettings();
});
});
1 change: 1 addition & 0 deletions x-pack/plugins/uptime/e2e/journeys/alerts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@

export * from './tls_alert_flyouts_in_alerting_app';
export * from './status_alert_flyouts_in_alerting_app';
export * from './default_email_settings';
4 changes: 4 additions & 0 deletions x-pack/plugins/uptime/e2e/journeys/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,7 @@ export const assertText = async ({ page, text }: { page: Page; text: string }) =
await page.waitForSelector(`text=${text}`);
expect(await page.$(`text=${text}`)).toBeTruthy();
};

export const assertNotText = async ({ page, text }: { page: Page; text: string }) => {
expect(await page.$(`text=${text}`)).toBeFalsy();
};
4 changes: 2 additions & 2 deletions x-pack/plugins/uptime/e2e/page_objects/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import { Page } from '@elastic/synthetics';

export function loginPageProvider({
page,
isRemote,
isRemote = false,
username = 'elastic',
password = 'changeme',
}: {
page: Page;
isRemote: boolean;
isRemote?: boolean;
username?: string;
password?: string;
}) {
Expand Down
41 changes: 41 additions & 0 deletions x-pack/plugins/uptime/e2e/page_objects/settings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import { expect, Page } from '@elastic/synthetics';
import { loginPageProvider } from './login';
import { utilsPageProvider } from './utils';
import { byTestId } from '../journeys/utils';

export function settingsPageProvider({ page }: { page: Page; kibanaUrl: string }) {
return {
...loginPageProvider({ page }),
...utilsPageProvider({ page }),

async fillToEmail(text: string) {
await page.fill(
'[data-test-subj=toEmailAddressInput] >> [data-test-subj=comboBoxSearchInput]',
text
);

await page.click(byTestId('uptimeSettingsPage'));
},
async saveSettings() {
await page.click(byTestId('apply-settings-button'));
await this.waitForLoadingToFinish();
await this.assertText({ text: 'Settings saved!' });
},
async assertApplyEnabled() {
expect(await page.isEnabled(byTestId('apply-settings-button'))).toBeTruthy();
},
async assertApplyDisabled() {
expect(await page.isEnabled(byTestId('apply-settings-button'))).toBeFalsy();
},
async removeInvalidEmail(invalidEmail: string) {
await page.click(`[title="Remove ${invalidEmail} from selection in this group"]`);
},
};
}
Loading