diff --git a/docs/user/alerting/images/rule-details-alerts-inactive.png b/docs/user/alerting/images/rule-details-alerts-inactive.png
index f84910ae0dcdc..fc82cf465ebb2 100644
Binary files a/docs/user/alerting/images/rule-details-alerts-inactive.png and b/docs/user/alerting/images/rule-details-alerts-inactive.png differ
diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts
index 7bc965f0aa5c8..27e3aa1df61f5 100644
--- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts
+++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts
@@ -981,6 +981,11 @@ export class AlertsClient {
...this.apiKeyAsAlertAttributes(createdAPIKey, username),
updatedBy: username,
updatedAt: new Date().toISOString(),
+ executionStatus: {
+ status: 'pending',
+ lastExecutionDate: new Date().toISOString(),
+ error: null,
+ },
});
try {
await this.unsecuredSavedObjectsClient.update('alert', id, updateAttributes, { version });
diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/enable.test.ts b/x-pack/plugins/alerting/server/alerts_client/tests/enable.test.ts
index 7b0d6d7b1f10b..8c0a09c74457e 100644
--- a/x-pack/plugins/alerting/server/alerts_client/tests/enable.test.ts
+++ b/x-pack/plugins/alerting/server/alerts_client/tests/enable.test.ts
@@ -248,6 +248,11 @@ describe('enable()', () => {
},
},
],
+ executionStatus: {
+ status: 'pending',
+ lastExecutionDate: '2019-02-12T21:01:22.479Z',
+ error: null,
+ },
},
{
version: '123',
@@ -352,6 +357,11 @@ describe('enable()', () => {
},
},
],
+ executionStatus: {
+ status: 'pending',
+ lastExecutionDate: '2019-02-12T21:01:22.479Z',
+ error: null,
+ },
},
{
version: '123',
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx
index a41708f052dc8..1bbffc850ee18 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx
@@ -8,6 +8,8 @@
import * as React from 'react';
import uuid from 'uuid';
import { shallow } from 'enzyme';
+import { mountWithIntl, nextTick } from '@kbn/test/jest';
+import { act } from '@testing-library/react';
import { AlertDetails } from './alert_details';
import { Alert, ActionType, AlertTypeModel, AlertType } from '../../../../types';
import { EuiTitle, EuiBadge, EuiFlexItem, EuiSwitch, EuiButtonEmpty, EuiText } from '@elastic/eui';
@@ -463,6 +465,74 @@ describe('disable button', () => {
handler!({} as React.FormEvent);
expect(enableAlert).toHaveBeenCalledTimes(1);
});
+
+ it('should reset error banner dismissal after re-enabling the alert', async () => {
+ const alert = mockAlert({
+ enabled: true,
+ executionStatus: {
+ status: 'error',
+ lastExecutionDate: new Date('2020-08-20T19:23:38Z'),
+ error: {
+ reason: AlertExecutionStatusErrorReasons.Execute,
+ message: 'Fail',
+ },
+ },
+ });
+
+ const alertType: AlertType = {
+ id: '.noop',
+ name: 'No Op',
+ actionGroups: [{ id: 'default', name: 'Default' }],
+ recoveryActionGroup,
+ actionVariables: { context: [], state: [], params: [] },
+ defaultActionGroupId: 'default',
+ producer: ALERTS_FEATURE_ID,
+ authorizedConsumers,
+ minimumLicenseRequired: 'basic',
+ enabledInLicense: true,
+ };
+
+ const disableAlert = jest.fn();
+ const enableAlert = jest.fn();
+ const wrapper = mountWithIntl(
+
+ );
+
+ await act(async () => {
+ await nextTick();
+ wrapper.update();
+ });
+
+ // Dismiss the error banner
+ await act(async () => {
+ wrapper.find('[data-test-subj="dismiss-execution-error"]').first().simulate('click');
+ await nextTick();
+ });
+
+ // Disable the alert
+ await act(async () => {
+ wrapper.find('[data-test-subj="disableSwitch"] .euiSwitch__button').first().simulate('click');
+ await nextTick();
+ });
+ expect(disableAlert).toHaveBeenCalled();
+
+ // Enable the alert
+ await act(async () => {
+ wrapper.find('[data-test-subj="disableSwitch"] .euiSwitch__button').first().simulate('click');
+ await nextTick();
+ });
+ expect(enableAlert).toHaveBeenCalled();
+
+ // Ensure error banner is back
+ expect(wrapper.find('[data-test-subj="dismiss-execution-error"]').length).toBeGreaterThan(0);
+ });
});
describe('mute button', () => {
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx
index 0796f09b13460..d85e792f4a9bb 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx
@@ -236,6 +236,8 @@ export const AlertDetails: React.FunctionComponent = ({
if (isEnabled) {
setIsEnabled(false);
await disableAlert(alert);
+ // Reset dismiss if previously clicked
+ setDissmissAlertErrors(false);
} else {
setIsEnabled(true);
await enableAlert(alert);
@@ -277,7 +279,7 @@ export const AlertDetails: React.FunctionComponent = ({
- {!dissmissAlertErrors && alert.executionStatus.status === 'error' ? (
+ {alert.enabled && !dissmissAlertErrors && alert.executionStatus.status === 'error' ? (
= ({
- setDissmissAlertErrors(true)}>
+ setDissmissAlertErrors(true)}
+ >
{
};
expect(alertInstanceToListItem(fakeNow.getTime(), alertType, 'id', instance)).toEqual({
instance: 'id',
- status: { label: 'OK', healthColor: 'subdued' },
+ status: { label: 'Recovered', healthColor: 'subdued' },
start: undefined,
duration: 0,
sortPriority: 1,
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances.tsx
index d2919194125f8..5ba4c466f6fad 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances.tsx
@@ -226,7 +226,7 @@ const ACTIVE_LABEL = i18n.translate(
const INACTIVE_LABEL = i18n.translate(
'xpack.triggersActionsUI.sections.alertDetails.alertInstancesList.status.inactive',
- { defaultMessage: 'OK' }
+ { defaultMessage: 'Recovered' }
);
function getActionGroupName(alertType: AlertType, actionGroupId?: string): string | undefined {
diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts
index b38b605bc1b67..34e08ad257f84 100644
--- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts
+++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts
@@ -655,7 +655,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
).to.eql([
{
instance: 'eu/east',
- status: 'OK',
+ status: 'Recovered',
start: '',
duration: '',
},