Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions x-pack/platform/plugins/shared/alerting/server/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -671,11 +671,11 @@ export class AlertingPlugin {
return rulesSettingsClientFactory!.create(request);
};

const getMaintenanceWindowClientInternal = (request: KibanaRequest) => {
const getMaintenanceWindowClient = (request: KibanaRequest) => {
if (!plugins.maintenanceWindows) {
return;
}
return plugins.maintenanceWindows.getMaintenanceWindowClientInternal(request);
return plugins.maintenanceWindows.getMaintenanceWindowClientWithoutAuth(request);
};

taskRunnerFactory.initialize({
Expand All @@ -697,7 +697,7 @@ export class AlertingPlugin {
maintenanceWindowsService: new MaintenanceWindowsService({
cacheInterval: this.config.rulesSettings.cacheInterval,
logger,
getMaintenanceWindowClientInternal,
getMaintenanceWindowClient,
}),
maxAlerts: this.config.rules.run.alerts.max,
ruleTypeRegistry: this.ruleTypeRegistry!,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ describe('MaintenanceWindowsService', () => {
test('should load maintenance windows if none in cache', async () => {
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(maintenanceWindows);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});
// @ts-ignore - accessing private variable
Expand Down Expand Up @@ -103,7 +103,7 @@ describe('MaintenanceWindowsService', () => {
throw new Error('Test error');
});
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});
// @ts-ignore - accessing private variable
Expand Down Expand Up @@ -139,7 +139,7 @@ describe('MaintenanceWindowsService', () => {
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(maintenanceWindows);
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(newSpaceMW);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});
// @ts-ignore - accessing private variable
Expand Down Expand Up @@ -190,7 +190,7 @@ describe('MaintenanceWindowsService', () => {
test('should use cached windows if cache has not expired', async () => {
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(maintenanceWindows);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});

Expand Down Expand Up @@ -226,7 +226,7 @@ describe('MaintenanceWindowsService', () => {
maintenanceWindows[0],
]);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});

Expand Down Expand Up @@ -263,7 +263,7 @@ describe('MaintenanceWindowsService', () => {
throw new Error('Test error');
});
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});

Expand Down Expand Up @@ -303,7 +303,7 @@ describe('MaintenanceWindowsService', () => {
];
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(mw);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});

Expand Down Expand Up @@ -353,7 +353,7 @@ describe('MaintenanceWindowsService', () => {
}));
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(mw);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});

Expand Down Expand Up @@ -407,7 +407,7 @@ describe('MaintenanceWindowsService', () => {
];
maintenanceWindowClient.getActiveMaintenanceWindows.mockResolvedValueOnce(mw);
const maintenanceWindowsService = new MaintenanceWindowsService({
getMaintenanceWindowClientInternal: jest.fn().mockReturnValue(maintenanceWindowClient),
getMaintenanceWindowClient: jest.fn().mockReturnValue(maintenanceWindowClient),
logger,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ export const DEFAULT_CACHE_INTERVAL_MS = 60000; // 1 minute cache

interface MaintenanceWindowServiceOpts {
cacheInterval?: number;
getMaintenanceWindowClientInternal: (
request: KibanaRequest
) => MaintenanceWindowClient | undefined;
getMaintenanceWindowClient: (request: KibanaRequest) => MaintenanceWindowClient | undefined;
logger: Logger;
}

Expand Down Expand Up @@ -135,7 +133,7 @@ export class MaintenanceWindowsService {
now: number
): Promise<MaintenanceWindow[]> {
return await withAlertingSpan('alerting:load-maintenance-windows', async () => {
const maintenanceWindowClient = this.options.getMaintenanceWindowClientInternal(request);
const maintenanceWindowClient = this.options.getMaintenanceWindowClient(request);
const activeMaintenanceWindows = maintenanceWindowClient
? await maintenanceWindowClient.getActiveMaintenanceWindows(this.cacheIntervalMs)
: [];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ test('creates an unauthorized maintenance window client', async () => {

savedObjectsService.getScopedClient.mockReturnValue(savedObjectsClient);

factory.create(request);
factory.createWithoutAuthorization(request);

expect(savedObjectsService.getScopedClient).toHaveBeenCalledWith(request, {
excludedExtensions: [SECURITY_EXTENSION_ID],
Expand All @@ -103,6 +103,26 @@ test('creates an unauthorized maintenance window client', async () => {
});
});

test('creates an internal maintenance window client', async () => {
const factory = new MaintenanceWindowClientFactory();
factory.initialize(maintenanceWindowClientFactoryParams);
const request = mockRouter.createKibanaRequest();
const mockRepository = savedObjectsService.createInternalRepository();
savedObjectsService.createInternalRepository.mockReturnValue(mockRepository);

factory.createInternal(request);

expect(savedObjectsService.createInternalRepository).toHaveBeenCalledWith();

const { MaintenanceWindowClient } = jest.requireMock('./client');

expect(MaintenanceWindowClient).toHaveBeenCalledWith({
logger: maintenanceWindowClientFactoryParams.logger,
savedObjectsClient: mockRepository,
getUserName: expect.any(Function),
});
});

test('getUserName() returns null when security is disabled', async () => {
const factory = new MaintenanceWindowClientFactory();
factory.initialize(maintenanceWindowClientFactoryParams);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import type {
KibanaRequest,
Logger,
SavedObjectsClientContract,
SavedObjectsServiceStart,
SecurityServiceStart,
UiSettingsServiceStart,
Expand Down Expand Up @@ -41,19 +42,18 @@ export class MaintenanceWindowClientFactory {
this.uiSettings = options.uiSettings;
}

private getSoClient(request: KibanaRequest, withAuth: boolean): SavedObjectsClientContract {
return this.savedObjectsService.getScopedClient(request, {
includedHiddenTypes: [MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE],
...(withAuth ? {} : { excludedExtensions: [SECURITY_EXTENSION_ID] }),
});
}

private createMaintenanceWindowClient(
request: KibanaRequest,
withAuth: boolean,
excludedExtensions?: ['spaces']
savedObjectsClient: SavedObjectsClientContract
) {
const { securityService } = this;
const savedObjectsClient = this.savedObjectsService.getScopedClient(request, {
includedHiddenTypes: [MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE],
...(withAuth
? {}
: { excludedExtensions: [...(excludedExtensions ?? []), SECURITY_EXTENSION_ID] }),
});

const uiSettingClient = this.uiSettings.asScopedToClient(savedObjectsClient);

return new MaintenanceWindowClient({
Expand All @@ -68,10 +68,17 @@ export class MaintenanceWindowClientFactory {
}

public createWithAuthorization(request: KibanaRequest) {
return this.createMaintenanceWindowClient(request, true);
const soClient = this.getSoClient(request, true);
return this.createMaintenanceWindowClient(request, soClient);
}

public createWithoutAuthorization(request: KibanaRequest) {
const soClient = this.getSoClient(request, false);
return this.createMaintenanceWindowClient(request, soClient);
}

public create(request: KibanaRequest, excludedExtension?: ['spaces']) {
return this.createMaintenanceWindowClient(request, false, excludedExtension);
public createInternal(request: KibanaRequest) {
const savedObjectsInternalClient = this.savedObjectsService.createInternalRepository();
return this.createMaintenanceWindowClient(request, savedObjectsInternalClient);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ const createStartMock = () => {
getMaintenanceWindowClientWithAuth: jest
.fn()
.mockResolvedValue(maintenanceWindowClientMock.create()),
getMaintenanceWindowClientWithoutAuth: jest
.fn()
.mockResolvedValue(maintenanceWindowClientMock.create()),
});

return mock;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,40 @@ describe('Maintenance Windows Plugin', () => {
expect(client).toBeDefined();
});

test(`exposes getMaintenanceWindowClientWithoutAuth()`, async () => {
const context = coreMock.createPluginInitializerContext();
const plugin = new MaintenanceWindowsPlugin(context);

plugin.setup(coreMock.createSetup(), {
licensing: licensingMock.createSetup(),
taskManager: taskManagerMock.createSetup(),
features: featuresPluginMock.createSetup(),
});

const startContract = plugin.start(coreMock.createStart(), {
taskManager: taskManagerMock.createStart(),
});

const fakeRequest = {
headers: {},
getBasePath: () => '',
path: '/',
route: { settings: {} },
url: {
href: '/',
},
raw: {
req: {
url: '/',
},
},
getSavedObjectsClient: jest.fn(),
} as unknown as KibanaRequest;

const client = startContract.getMaintenanceWindowClientWithoutAuth(fakeRequest);
expect(client).toBeDefined();
});

test(`exposes getMaintenanceWindowClientInternal()`, async () => {
const context = coreMock.createPluginInitializerContext();
const plugin = new MaintenanceWindowsPlugin(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,17 +107,23 @@ export class MaintenanceWindowsPlugin
return maintenanceWindowClientFactory.createWithAuthorization(request);
};

const getMaintenanceWindowClientWithoutAuth = (
request: KibanaRequest
): MaintenanceWindowClientApi => {
return maintenanceWindowClientFactory.createWithoutAuthorization(request);
};

const getMaintenanceWindowClientInternal = (
request: KibanaRequest,
excludedExtension?: ['spaces']
request: KibanaRequest
): MaintenanceWindowClientApi => {
return maintenanceWindowClientFactory.create(request, excludedExtension);
return maintenanceWindowClientFactory.createInternal(request);
};

scheduleMaintenanceWindowEventsGenerator(this.logger, plugins.taskManager).catch(() => {});

return {
getMaintenanceWindowClientWithAuth,
getMaintenanceWindowClientWithoutAuth,
getMaintenanceWindowClientInternal,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ export interface MaintenanceWindowsServerStartDependencies {
}

export interface MaintenanceWindowsServerStart {
getMaintenanceWindowClientInternal(
request: KibanaRequest,
excludedExtension?: string[]
): MaintenanceWindowClientApi;
getMaintenanceWindowClientInternal(request: KibanaRequest): MaintenanceWindowClientApi;
getMaintenanceWindowClientWithAuth(request: KibanaRequest): MaintenanceWindowClientApi;
getMaintenanceWindowClientWithoutAuth(request: KibanaRequest): MaintenanceWindowClientApi;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import type {
SavedObjectsClientContract,
KibanaRequest,
} from '@kbn/core/server';
import { SPACES_EXTENSION_ID } from '@kbn/core/server';
import { SavedObjectsClient } from '@kbn/core/server';
import { mappingFromFieldMap } from '@kbn/alerting-plugin/common';
import { Dataset } from '@kbn/rule-registry-plugin/server';
Expand Down Expand Up @@ -130,9 +129,7 @@ export class Plugin implements PluginType {
return;
}

return pluginsStart.maintenanceWindows?.getMaintenanceWindowClientInternal(request, [
SPACES_EXTENSION_ID,
]);
return pluginsStart.maintenanceWindows?.getMaintenanceWindowClientInternal(request);
};

if (this.server) {
Expand Down