From 0a153d8e197918dbbb60ff2c112f109f8d3cd9b0 Mon Sep 17 00:00:00 2001 From: Jiawei Wu Date: Mon, 8 May 2023 16:02:17 -0700 Subject: [PATCH 1/3] Fix active maintenance window query --- .../maintenance_window_client.ts | 5 +- .../get_active_maintenance_windows.test.ts | 83 +++---------------- .../methods/get_active_maintenance_windows.ts | 24 +----- .../active_maintenance_windows.ts | 2 +- .../active_maintenance_windows.ts | 47 +++++++++++ 5 files changed, 66 insertions(+), 95 deletions(-) diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts b/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts index 8b830a5d9c55a..afda98960420e 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts @@ -14,7 +14,6 @@ import { deleteMaintenanceWindow, DeleteParams } from './methods/delete'; import { archive, ArchiveParams } from './methods/archive'; import { getActiveMaintenanceWindows, - ActiveParams, } from './methods/get_active_maintenance_windows'; import { finish, FinishParams } from './methods/finish'; @@ -71,6 +70,6 @@ export class MaintenanceWindowClient { archive(this.context, params); public finish = (params: FinishParams): Promise => finish(this.context, params); - public getActiveMaintenanceWindows = (params?: ActiveParams): Promise => - getActiveMaintenanceWindows(this.context, params); + public getActiveMaintenanceWindows = (): Promise => + getActiveMaintenanceWindows(this.context); } diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.test.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.test.ts index 5622e7c1f69d5..2351a687728c8 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.test.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.test.ts @@ -48,12 +48,7 @@ describe('MaintenanceWindowClient - getActiveMaintenanceWindows', () => { ], } as unknown as SavedObjectsFindResponse); - const startDate = new Date().toISOString(); - - const result = await getActiveMaintenanceWindows(mockContext, { - start: startDate, - interval: '1h', - }); + const result = await getActiveMaintenanceWindows(mockContext); const findCallParams = savedObjectsClient.find.mock.calls[0][0]; @@ -65,33 +60,11 @@ describe('MaintenanceWindowClient - getActiveMaintenanceWindows', () => { "filter": Array [ Object { "bool": Object { - "filter": Array [ - Object { - "bool": Object { - "minimum_should_match": 1, - "should": Array [ - Object { - "range": Object { - "maintenance-window.attributes.events": Object { - "gte": "2023-02-26T00:00:00.000Z", - }, - }, - }, - ], - }, - }, + "minimum_should_match": 1, + "should": Array [ Object { - "bool": Object { - "minimum_should_match": 1, - "should": Array [ - Object { - "range": Object { - "maintenance-window.attributes.events": Object { - "lte": "2023-02-26T01:00:00.000Z", - }, - }, - }, - ], + "match": Object { + "maintenance-window.attributes.events": "2023-02-26T00:00:00.000Z", }, }, ], @@ -131,12 +104,7 @@ describe('MaintenanceWindowClient - getActiveMaintenanceWindows', () => { saved_objects: [], } as unknown as SavedObjectsFindResponse); - const startDate = new Date().toISOString(); - - const result = await getActiveMaintenanceWindows(mockContext, { - start: startDate, - interval: '4d', - }); + const result = await getActiveMaintenanceWindows(mockContext); const findCallParams = savedObjectsClient.find.mock.calls[0][0]; @@ -147,33 +115,11 @@ describe('MaintenanceWindowClient - getActiveMaintenanceWindows', () => { "filter": Array [ Object { "bool": Object { - "filter": Array [ - Object { - "bool": Object { - "minimum_should_match": 1, - "should": Array [ - Object { - "range": Object { - "maintenance-window.attributes.events": Object { - "gte": "2023-02-26T00:00:00.000Z", - }, - }, - }, - ], - }, - }, + "minimum_should_match": 1, + "should": Array [ Object { - "bool": Object { - "minimum_should_match": 1, - "should": Array [ - Object { - "range": Object { - "maintenance-window.attributes.events": Object { - "lte": "2023-03-02T00:00:00.000Z", - }, - }, - }, - ], + "match": Object { + "maintenance-window.attributes.events": "2023-02-26T00:00:00.000Z", }, }, ], @@ -203,17 +149,12 @@ describe('MaintenanceWindowClient - getActiveMaintenanceWindows', () => { savedObjectsClient.find.mockRejectedValueOnce('something went wrong'); - const startDate = new Date().toISOString(); - await expect(async () => { - await getActiveMaintenanceWindows(mockContext, { - start: startDate, - interval: '4d', - }); + await getActiveMaintenanceWindows(mockContext); }).rejects.toThrowError(); expect(mockContext.logger.error).toHaveBeenLastCalledWith( - 'Failed to find active maintenance window by interval: 4d with start date: 2023-02-26T00:00:00.000Z, Error: something went wrong' + 'Failed to find active maintenance window by interval, Error: something went wrong' ); }); }); diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts index 201d0aaaded41..1c58a1753c700 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts @@ -6,14 +6,12 @@ */ import Boom from '@hapi/boom'; -import moment from 'moment'; -import { nodeBuilder, fromKueryExpression } from '@kbn/es-query'; +import { nodeBuilder } from '@kbn/es-query'; import { getMaintenanceWindowFromRaw } from '../get_maintenance_window_from_raw'; import { MaintenanceWindow, MaintenanceWindowSOAttributes, MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, - parseDuration, MaintenanceWindowClientContext, } from '../../../common'; @@ -27,30 +25,16 @@ export interface MaintenanceWindowAggregationResult { }; } -export interface ActiveParams { - start?: string; - interval?: string; -} - export async function getActiveMaintenanceWindows( context: MaintenanceWindowClientContext, - params?: ActiveParams ): Promise { const { savedObjectsClient, logger } = context; - const { start, interval } = params || {}; - - const startDate = start ? new Date(start) : new Date(); - const duration = interval ? parseDuration(interval) : 0; - const endDate = moment.utc(startDate).add(duration, 'ms').toDate(); + const startDate = new Date(); const startDateISO = startDate.toISOString(); - const endDateISO = endDate.toISOString(); const filter = nodeBuilder.and([ - nodeBuilder.and([ - fromKueryExpression(`maintenance-window.attributes.events >= "${startDateISO}"`), - fromKueryExpression(`maintenance-window.attributes.events <= "${endDateISO}"`), - ]), + nodeBuilder.is('maintenance-window.attributes.events', startDateISO), nodeBuilder.is('maintenance-window.attributes.enabled', 'true'), ]); @@ -67,7 +51,7 @@ export async function getActiveMaintenanceWindows( }) ); } catch (e) { - const errorMessage = `Failed to find active maintenance window by interval: ${interval} with start date: ${startDate.toISOString()}, Error: ${e}`; + const errorMessage = `Failed to find active maintenance window by interval, Error: ${e}`; logger.error(errorMessage); throw Boom.boomify(e, { message: errorMessage }); } diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/active_maintenance_windows.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/active_maintenance_windows.ts index 9b64eca1b6964..c2a8d6c761d63 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/active_maintenance_windows.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/active_maintenance_windows.ts @@ -39,7 +39,7 @@ export const activeMaintenanceWindowsRoute = ( }); } const maintenanceWindowClient = (await context.alerting).getMaintenanceWindowClient(); - const result = await maintenanceWindowClient.getActiveMaintenanceWindows({}); + const result = await maintenanceWindowClient.getActiveMaintenanceWindows(); return res.ok({ body: result.map((maintenanceWindow) => rewriteMaintenanceWindowRes(maintenanceWindow)), diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts index abd837485c7ec..8d00f1bcaa9c3 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts @@ -24,6 +24,7 @@ export default function activeMaintenanceWindowTests({ getService }: FtrProvider r_rule: { dtstart: new Date().toISOString(), tzid: 'UTC', + count: 10, freq: 2, // weekly }, }; @@ -121,6 +122,52 @@ export default function activeMaintenanceWindowTests({ getService }: FtrProvider }); } + it('should return active maintenance windows', async () => { + await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) + .set('kbn-xsrf', 'foo') + .send({ + ...createParams, + duration: 5 * 60 * 1000, // 5 mins + r_rule: { + ...createParams.r_rule, + dtstart: moment.utc().subtract(10, 'minutes').toISOString(), + }, + }) + .expect(200); + + const { body: window2 } = await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) + .set('kbn-xsrf', 'foo') + .send({ + ...createParams, + duration: 5 * 60 * 1000, // 5 mins + }) + .expect(200); + + await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) + .set('kbn-xsrf', 'foo') + .send({ + ...createParams, + duration: 5 * 60 * 1000, // 5 mins + r_rule: { + ...createParams.r_rule, + dtstart: moment.utc().add(10, 'minutes').toISOString(), + }, + }) + .expect(200); + + const { body: activeWindows } = await supertest + .get(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window/_active`) + .set('kbn-xsrf', 'foo') + .send({}) + .expect(200); + + expect(activeWindows.length).eql(1); + expect(activeWindows[0].id).eql(window2.id); + }); + it('should return an empty array if there are no active maintenance windows', async () => { const { body: createdMaintenanceWindow } = await supertest .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) From c5d9134912801ae5891c15c8e94f53f857c86a06 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 8 May 2023 23:14:19 +0000 Subject: [PATCH 2/3] [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' --- .../maintenance_window_client/maintenance_window_client.ts | 4 +--- .../methods/get_active_maintenance_windows.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts b/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts index afda98960420e..a38f8a04b32ed 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts @@ -12,9 +12,7 @@ import { update, UpdateParams } from './methods/update'; import { find, FindResult } from './methods/find'; import { deleteMaintenanceWindow, DeleteParams } from './methods/delete'; import { archive, ArchiveParams } from './methods/archive'; -import { - getActiveMaintenanceWindows, -} from './methods/get_active_maintenance_windows'; +import { getActiveMaintenanceWindows } from './methods/get_active_maintenance_windows'; import { finish, FinishParams } from './methods/finish'; import { diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts index 1c58a1753c700..ececf6618b0a5 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/get_active_maintenance_windows.ts @@ -26,7 +26,7 @@ export interface MaintenanceWindowAggregationResult { } export async function getActiveMaintenanceWindows( - context: MaintenanceWindowClientContext, + context: MaintenanceWindowClientContext ): Promise { const { savedObjectsClient, logger } = context; From 6908d406463ff4e79e877c8113ed8572cfdde6e2 Mon Sep 17 00:00:00 2001 From: Jiawei Wu Date: Mon, 8 May 2023 17:59:06 -0700 Subject: [PATCH 3/3] Fix test --- .../active_maintenance_windows.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts index 8d00f1bcaa9c3..ac1429ae4fc34 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts @@ -28,7 +28,7 @@ export default function activeMaintenanceWindowTests({ getService }: FtrProvider freq: 2, // weekly }, }; - after(() => objectRemover.removeAll()); + afterEach(() => objectRemover.removeAll()); for (const scenario of UserAtSpaceScenarios) { const { user, space } = scenario; @@ -123,41 +123,51 @@ export default function activeMaintenanceWindowTests({ getService }: FtrProvider } it('should return active maintenance windows', async () => { - await supertest + const { body: window1 } = await supertest .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) .set('kbn-xsrf', 'foo') .send({ ...createParams, - duration: 5 * 60 * 1000, // 5 mins + duration: 30 * 60 * 1000, r_rule: { ...createParams.r_rule, - dtstart: moment.utc().subtract(10, 'minutes').toISOString(), + dtstart: moment().subtract(1, 'hour').toISOString(), }, }) .expect(200); + objectRemover.add('space1', window1.id, 'rules/maintenance_window', 'alerting', true); + const { body: window2 } = await supertest .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) .set('kbn-xsrf', 'foo') .send({ ...createParams, - duration: 5 * 60 * 1000, // 5 mins + duration: 30 * 60 * 1000, + r_rule: { + ...createParams.r_rule, + dtstart: moment().subtract(5, 'minutes').toISOString(), + }, }) .expect(200); - await supertest + objectRemover.add('space1', window2.id, 'rules/maintenance_window', 'alerting', true); + + const { body: window3 } = await supertest .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) .set('kbn-xsrf', 'foo') .send({ ...createParams, - duration: 5 * 60 * 1000, // 5 mins + duration: 30 * 60 * 1000, r_rule: { ...createParams.r_rule, - dtstart: moment.utc().add(10, 'minutes').toISOString(), + dtstart: moment().add(1, 'hour').toISOString(), }, }) .expect(200); + objectRemover.add('space1', window3.id, 'rules/maintenance_window', 'alerting', true); + const { body: activeWindows } = await supertest .get(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window/_active`) .set('kbn-xsrf', 'foo')