Skip to content

Commit 63d5bc3

Browse files
committed
First commit
1 parent d05a11c commit 63d5bc3

9 files changed

Lines changed: 134 additions & 72 deletions

File tree

x-pack/platform/plugins/shared/alerting_v2/server/lib/alert_actions_client/alert_actions_client.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
* 2.0.
66
*/
77

8-
import { httpServerMock } from '@kbn/core-http-server-mocks';
9-
import { securityMock } from '@kbn/security-plugin/server/mocks';
108
import type { CreateAlertActionBody } from '../../routes/schemas/alert_action_schema';
119
import { createQueryService } from '../services/query_service/query_service.mock';
1210
import { createStorageService } from '../services/storage_service/storage_service.mock';
11+
import type { UserServiceContract } from '../services/user_service/user_service';
1312
import { AlertActionsClient } from './alert_actions_client';
1413
import {
1514
getBulkAlertEventsESQLResponse,
@@ -19,16 +18,17 @@ import {
1918

2019
describe('AlertActionsClient', () => {
2120
jest.useFakeTimers().setSystemTime(new Date('2025-01-01T11:12:13.000Z'));
22-
const request = httpServerMock.createKibanaRequest();
2321
const { queryService, mockEsClient: queryServiceEsClient } = createQueryService();
2422
const { storageService, mockEsClient: storageServiceEsClient } = createStorageService();
25-
const security = securityMock.createStart();
23+
const userService: jest.Mocked<UserServiceContract> = {
24+
getCurrentUserProfileUid: jest.fn(),
25+
};
2626
let client: AlertActionsClient;
2727

2828
beforeEach(() => {
29-
security.authc.getCurrentUser = jest.fn().mockReturnValue({ username: 'test-user' });
29+
userService.getCurrentUserProfileUid.mockReturnValue('test-uid');
3030
storageServiceEsClient.bulk.mockResolvedValueOnce({ items: [], errors: false, took: 1 });
31-
client = new AlertActionsClient(request, queryService, storageService, security);
31+
client = new AlertActionsClient(queryService, storageService, userService);
3232
});
3333

3434
afterEach(() => {
@@ -62,7 +62,7 @@ describe('AlertActionsClient', () => {
6262
episode_id: 'episode-1',
6363
rule_id: 'test-rule-id',
6464
last_series_event_timestamp: '2025-01-01T00:00:00.000Z',
65-
actor: 'test-user',
65+
actor: 'test-uid',
6666
});
6767
expect(docs[0]).toHaveProperty('@timestamp');
6868
});
@@ -104,14 +104,14 @@ describe('AlertActionsClient', () => {
104104
expect(docs[0]).toMatchObject({ episode_id: 'episode-2' });
105105
});
106106

107-
it('should handle null username when security is not available', async () => {
107+
it('should handle null profile uid when security is not available', async () => {
108108
queryServiceEsClient.esql.query.mockResolvedValueOnce(getAlertEventESQLResponse());
109109

110+
userService.getCurrentUserProfileUid.mockReturnValueOnce(null);
110111
const clientWithoutSecurity = new AlertActionsClient(
111-
request,
112112
queryService,
113113
storageService,
114-
undefined
114+
userService
115115
);
116116

117117
await clientWithoutSecurity.createAction({

x-pack/platform/plugins/shared/alerting_v2/server/lib/alert_actions_client/alert_actions_client.ts

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,8 @@
66
*/
77

88
import Boom from '@hapi/boom';
9-
import { PluginStart } from '@kbn/core-di';
10-
import { Request } from '@kbn/core-di-server';
11-
import type { KibanaRequest } from '@kbn/core-http-server';
129
import { esql } from '@kbn/esql-language';
13-
import type { SecurityPluginStart } from '@kbn/security-plugin/server';
14-
import { inject, injectable, optional } from 'inversify';
10+
import { inject, injectable } from 'inversify';
1511
import { groupBy, omit } from 'lodash';
1612
import { ALERT_ACTIONS_DATA_STREAM, type AlertAction } from '../../resources/alert_actions';
1713
import { ALERT_EVENTS_DATA_STREAM } from '../../resources/alert_events';
@@ -23,22 +19,23 @@ import { queryResponseToRecords } from '../services/query_service/query_response
2319
import { QueryService, type QueryServiceContract } from '../services/query_service/query_service';
2420
import type { StorageServiceContract } from '../services/storage_service/storage_service';
2521
import { StorageServiceScopedToken } from '../services/storage_service/tokens';
22+
import type { UserServiceContract } from '../services/user_service/user_service';
23+
import { UserService } from '../services/user_service/user_service';
2624

2725
@injectable()
2826
export class AlertActionsClient {
2927
constructor(
30-
@inject(Request) private readonly request: KibanaRequest,
3128
@inject(QueryService) private readonly queryService: QueryServiceContract,
3229
@inject(StorageServiceScopedToken) private readonly storageService: StorageServiceContract,
33-
@optional() @inject(PluginStart('security')) private readonly security?: SecurityPluginStart
30+
@inject(UserService) private readonly userService: UserServiceContract
3431
) {}
3532

3633
public async createAction(params: {
3734
groupHash: string;
3835
action: CreateAlertActionBody;
3936
}): Promise<void> {
40-
const [username, alertEvent] = await Promise.all([
41-
this.getUserName(),
37+
const [userProfileUid, alertEvent] = await Promise.all([
38+
this.getUserProfileUid(),
4239
this.findLastAlertEventRecordOrThrow({
4340
groupHash: params.groupHash,
4441
episodeId: 'episode_id' in params.action ? params.action.episode_id : undefined,
@@ -51,7 +48,7 @@ export class AlertActionsClient {
5148
this.buildAlertActionDocument({
5249
action: params.action,
5350
alertEvent,
54-
username,
51+
userProfileUid,
5552
}),
5653
],
5754
});
@@ -60,8 +57,8 @@ export class AlertActionsClient {
6057
public async createBulkActions(
6158
actions: BulkCreateAlertActionItemBody[]
6259
): Promise<{ processed: number; total: number }> {
63-
const [username, records] = await Promise.all([
64-
this.getUserName(),
60+
const [userProfileUid, records] = await Promise.all([
61+
this.getUserProfileUid(),
6562
this.fetchLastAlertEventRecordsForActions(actions),
6663
]);
6764

@@ -82,7 +79,7 @@ export class AlertActionsClient {
8279
return this.buildAlertActionDocument({
8380
action,
8481
alertEvent: matchingAlertEventRecord,
85-
username,
82+
userProfileUid,
8683
});
8784
}
8885
})
@@ -122,21 +119,21 @@ export class AlertActionsClient {
122119
);
123120
}
124121

125-
private async getUserName(): Promise<string | null> {
126-
return this.security?.authc.getCurrentUser(this.request)?.username ?? null;
122+
private async getUserProfileUid(): Promise<string | null> {
123+
return this.userService.getCurrentUserProfileUid();
127124
}
128125

129126
private buildAlertActionDocument(params: {
130127
action: CreateAlertActionBody;
131128
alertEvent: AlertEventRecord;
132-
username: string | null;
129+
userProfileUid: string | null;
133130
}): AlertAction {
134-
const { action, alertEvent, username } = params;
131+
const { action, alertEvent, userProfileUid } = params;
135132
const actionData = omit(action, ['episode_id', 'action_type']);
136133

137134
return {
138135
'@timestamp': new Date().toISOString(),
139-
actor: username,
136+
actor: userProfileUid,
140137
action_type: action.action_type,
141138
last_series_event_timestamp: alertEvent['@timestamp'],
142139
rule_id: alertEvent.rule_id,

x-pack/platform/plugins/shared/alerting_v2/server/lib/rule_executor/steps/fetch_rule_step.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ describe('FetchRuleStep', () => {
3131
timeField: '@timestamp',
3232
lookbackWindow: '1m',
3333
groupingKey: [],
34-
createdBy: 'elastic',
34+
createdBy: 'elastic_profile_uid',
3535
createdAt: '2025-01-01T00:00:00.000Z',
36-
updatedBy: 'elastic',
36+
updatedBy: 'elastic_profile_uid',
3737
updatedAt: '2025-01-01T00:00:00.000Z',
3838
...overrides,
3939
});

x-pack/platform/plugins/shared/alerting_v2/server/lib/rules_client/rules_client.test.ts

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@
77

88
import { httpServerMock, httpServiceMock } from '@kbn/core-http-server-mocks';
99
import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks';
10-
import { securityMock } from '@kbn/security-plugin/server/mocks';
1110
import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server';
1211
import type { KibanaRequest } from '@kbn/core-http-server';
13-
import type { AuthenticatedUser } from '@kbn/core/server';
14-
import { mockAuthenticatedUser } from '@kbn/core-security-common/mocks';
1512

1613
import { RULE_SAVED_OBJECT_TYPE, type RuleSavedObjectAttributes } from '../../saved_objects';
1714
import { RulesClient } from './rules_client';
1815
import { createRulesSavedObjectService } from '../services/rules_saved_object_service/rules_saved_object_service.mock';
16+
import type { UserServiceContract } from '../services/user_service/user_service';
1917

2018
import type { CreateRuleParams, UpdateRuleData } from './types';
2119

@@ -37,7 +35,9 @@ describe('RulesClient', () => {
3735
const request: KibanaRequest = httpServerMock.createKibanaRequest();
3836
const http = httpServiceMock.createStartContract();
3937
const taskManager = taskManagerMock.createStart();
40-
const security = securityMock.createStart();
38+
const userService: jest.Mocked<UserServiceContract> = {
39+
getCurrentUserProfileUid: jest.fn(),
40+
};
4141
const { rulesSavedObjectService, mockSavedObjectsClient } = createRulesSavedObjectService();
4242

4343
const baseCreateData: CreateRuleParams['data'] = {
@@ -60,13 +60,7 @@ describe('RulesClient', () => {
6060

6161
// Default space
6262
http.basePath.get.mockReturnValue('/s/space-1');
63-
64-
const user: AuthenticatedUser = mockAuthenticatedUser({
65-
username: 'elastic',
66-
profile_uid: 'elastic_profile_uid',
67-
});
68-
security.authc.getCurrentUser.mockReturnValue(user);
69-
63+
userService.getCurrentUserProfileUid.mockReturnValue('elastic_profile_uid');
7064
mockSavedObjectsClient.create.mockResolvedValue({
7165
id: 'rule-id-default',
7266
type: RULE_SAVED_OBJECT_TYPE,
@@ -99,7 +93,7 @@ describe('RulesClient', () => {
9993
});
10094

10195
function createClient() {
102-
return new RulesClient(request, http, rulesSavedObjectService, taskManager, security);
96+
return new RulesClient(request, http, rulesSavedObjectService, taskManager, userService);
10397
}
10498

10599
describe('createRule', () => {
@@ -122,7 +116,7 @@ describe('RulesClient', () => {
122116
expect.objectContaining({
123117
name: 'rule-1',
124118
enabled: false,
125-
createdBy: 'elastic',
119+
createdBy: 'elastic_profile_uid',
126120
}),
127121
{ id: 'rule-id-1', overwrite: false }
128122
);
@@ -134,8 +128,8 @@ describe('RulesClient', () => {
134128
expect.objectContaining({
135129
id: 'rule-id-1',
136130
enabled: false,
137-
createdBy: 'elastic',
138-
updatedBy: 'elastic',
131+
createdBy: 'elastic_profile_uid',
132+
updatedBy: 'elastic_profile_uid',
139133
createdAt: '2025-01-01T00:00:00.000Z',
140134
updatedAt: '2025-01-01T00:00:00.000Z',
141135
})
@@ -246,9 +240,9 @@ describe('RulesClient', () => {
246240
const existingAttributes: RuleSavedObjectAttributes = {
247241
...baseCreateData,
248242
enabled: true,
249-
createdBy: 'elastic',
243+
createdBy: 'elastic_profile_uid',
250244
createdAt: '2025-01-01T00:00:00.000Z',
251-
updatedBy: 'elastic',
245+
updatedBy: 'elastic_profile_uid',
252246
updatedAt: '2025-01-01T00:00:00.000Z',
253247
};
254248
mockSavedObjectsClient.get.mockResolvedValueOnce({
@@ -283,9 +277,9 @@ describe('RulesClient', () => {
283277
const existingAttributes: RuleSavedObjectAttributes = {
284278
...baseCreateData,
285279
enabled: false,
286-
createdBy: 'elastic',
280+
createdBy: 'elastic_profile_uid',
287281
createdAt: '2025-01-01T00:00:00.000Z',
288-
updatedBy: 'elastic',
282+
updatedBy: 'elastic_profile_uid',
289283
updatedAt: '2025-01-01T00:00:00.000Z',
290284
};
291285
mockSavedObjectsClient.get.mockResolvedValueOnce({
@@ -316,9 +310,9 @@ describe('RulesClient', () => {
316310
const existingAttributes: RuleSavedObjectAttributes = {
317311
...baseCreateData,
318312
enabled: false,
319-
createdBy: 'elastic',
313+
createdBy: 'elastic_profile_uid',
320314
createdAt: '2025-01-01T00:00:00.000Z',
321-
updatedBy: 'elastic',
315+
updatedBy: 'elastic_profile_uid',
322316
updatedAt: '2025-01-01T00:00:00.000Z',
323317
};
324318
mockSavedObjectsClient.get.mockResolvedValueOnce({
@@ -348,9 +342,9 @@ describe('RulesClient', () => {
348342
const existingAttributes: RuleSavedObjectAttributes = {
349343
...baseCreateData,
350344
enabled: true,
351-
createdBy: 'elastic',
345+
createdBy: 'elastic_profile_uid',
352346
createdAt: '2025-01-01T00:00:00.000Z',
353-
updatedBy: 'elastic',
347+
updatedBy: 'elastic_profile_uid',
354348
updatedAt: '2025-01-01T00:00:00.000Z',
355349
};
356350
mockSavedObjectsClient.get.mockResolvedValueOnce({
@@ -396,9 +390,9 @@ describe('RulesClient', () => {
396390
const existingAttributes: RuleSavedObjectAttributes = {
397391
...baseCreateData,
398392
enabled: true,
399-
createdBy: 'elastic',
393+
createdBy: 'elastic_profile_uid',
400394
createdAt: '2025-01-01T00:00:00.000Z',
401-
updatedBy: 'elastic',
395+
updatedBy: 'elastic_profile_uid',
402396
updatedAt: '2025-01-01T00:00:00.000Z',
403397
};
404398
mockSavedObjectsClient.get.mockResolvedValueOnce({
@@ -451,9 +445,9 @@ describe('RulesClient', () => {
451445
...baseCreateData,
452446
name: 'rule-1',
453447
enabled: true,
454-
createdBy: 'elastic',
448+
createdBy: 'elastic_profile_uid',
455449
createdAt: '2025-01-01T00:00:00.000Z',
456-
updatedBy: 'elastic',
450+
updatedBy: 'elastic_profile_uid',
457451
updatedAt: '2025-01-01T00:00:00.000Z',
458452
},
459453
};
@@ -466,9 +460,9 @@ describe('RulesClient', () => {
466460
...baseCreateData,
467461
name: 'rule-2',
468462
enabled: false,
469-
createdBy: 'elastic',
463+
createdBy: 'elastic_profile_uid',
470464
createdAt: '2025-01-01T00:00:00.000Z',
471-
updatedBy: 'elastic',
465+
updatedBy: 'elastic_profile_uid',
472466
updatedAt: '2025-01-01T00:00:00.000Z',
473467
},
474468
};

0 commit comments

Comments
 (0)