mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
[Fleet] Add packagePoliceDelete
callback (#148509)
This commit is contained in:
parent
0076fa5641
commit
bd095f545b
24 changed files with 256 additions and 71 deletions
|
@ -29,7 +29,7 @@ import {
|
|||
import {
|
||||
ExternalCallback,
|
||||
FleetStartContract,
|
||||
PostPackagePolicyDeleteCallback,
|
||||
PostPackagePolicyPostDeleteCallback,
|
||||
PostPackagePolicyPostCreateCallback,
|
||||
} from '@kbn/fleet-plugin/server';
|
||||
import { CLOUD_SECURITY_POSTURE_PACKAGE_NAME } from '../common/constants';
|
||||
|
@ -298,9 +298,9 @@ describe('Cloud Security Posture Plugin', () => {
|
|||
const deletedPackagePolicyMock = deletePackagePolicyMock();
|
||||
deletedPackagePolicyMock[0].package!.name = CLOUD_SECURITY_POSTURE_PACKAGE_NAME;
|
||||
|
||||
const packagePolicyPostDeleteCallbacks: PostPackagePolicyDeleteCallback[] = [];
|
||||
const packagePolicyPostDeleteCallbacks: PostPackagePolicyPostDeleteCallback[] = [];
|
||||
fleetMock.registerExternalCallback.mockImplementation((...args) => {
|
||||
if (args[0] === 'postPackagePolicyDelete') {
|
||||
if (args[0] === 'packagePolicyPostDelete') {
|
||||
packagePolicyPostDeleteCallbacks.push(args[1]);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -16,7 +16,7 @@ import type {
|
|||
} from '@kbn/core/server';
|
||||
import type { DeepReadonly } from 'utility-types';
|
||||
import type {
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
PackagePolicy,
|
||||
NewPackagePolicy,
|
||||
} from '@kbn/fleet-plugin/common';
|
||||
|
@ -145,8 +145,8 @@ export class CspPlugin
|
|||
);
|
||||
|
||||
plugins.fleet.registerExternalCallback(
|
||||
'postPackagePolicyDelete',
|
||||
async (deletedPackagePolicies: DeepReadonly<DeletePackagePoliciesResponse>) => {
|
||||
'packagePolicyPostDelete',
|
||||
async (deletedPackagePolicies: DeepReadonly<PostDeletePackagePoliciesResponse>) => {
|
||||
for (const deletedPackagePolicy of deletedPackagePolicies) {
|
||||
if (isCspPackage(deletedPackagePolicy.package?.name)) {
|
||||
const soClient = core.savedObjects.createInternalRepository();
|
||||
|
|
|
@ -95,7 +95,7 @@ export type {
|
|||
GetAgentPoliciesRequest,
|
||||
GetAgentPoliciesResponse,
|
||||
GetAgentPoliciesResponseItem,
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
GetPackagesResponse,
|
||||
BulkInstallPackagesResponse,
|
||||
FleetErrorResponse,
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import type { DeletePackagePoliciesResponse, NewPackagePolicy, PackagePolicy } from './types';
|
||||
import type { PostDeletePackagePoliciesResponse, NewPackagePolicy, PackagePolicy } from './types';
|
||||
import type { FleetAuthz } from './authz';
|
||||
import { ENDPOINT_PRIVILEGES } from './constants';
|
||||
|
||||
|
@ -47,7 +47,7 @@ export const createPackagePolicyMock = (): PackagePolicy => {
|
|||
};
|
||||
};
|
||||
|
||||
export const deletePackagePolicyMock = (): DeletePackagePoliciesResponse => {
|
||||
export const deletePackagePolicyMock = (): PostDeletePackagePoliciesResponse => {
|
||||
const newPackagePolicy = createNewPackagePolicyMock();
|
||||
return [
|
||||
{
|
||||
|
|
|
@ -54,7 +54,9 @@ export interface DeletePackagePoliciesRequest {
|
|||
};
|
||||
}
|
||||
|
||||
export type DeletePackagePoliciesResponse = Array<{
|
||||
export type DeletePackagePoliciesResponse = PackagePolicy[];
|
||||
|
||||
export type PostDeletePackagePoliciesResponse = Array<{
|
||||
id: string;
|
||||
name?: string;
|
||||
success: boolean;
|
||||
|
|
|
@ -14,7 +14,7 @@ import type {
|
|||
} from '../../types';
|
||||
import type {
|
||||
DeletePackagePoliciesRequest,
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
GetPackagePoliciesRequest,
|
||||
GetPackagePoliciesResponse,
|
||||
GetOnePackagePolicyResponse,
|
||||
|
@ -44,7 +44,7 @@ export const sendUpdatePackagePolicy = (
|
|||
};
|
||||
|
||||
export const sendDeletePackagePolicy = (body: DeletePackagePoliciesRequest['body']) => {
|
||||
return sendRequest<DeletePackagePoliciesResponse>({
|
||||
return sendRequest<PostDeletePackagePoliciesResponse>({
|
||||
path: packagePolicyRouteService.getDeletePath(),
|
||||
method: 'post',
|
||||
body: JSON.stringify(body),
|
||||
|
|
|
@ -27,7 +27,7 @@ export type { FleetSetupContract, FleetSetupDeps, FleetStartContract } from './p
|
|||
export type {
|
||||
ExternalCallback,
|
||||
PutPackagePolicyUpdateCallback,
|
||||
PostPackagePolicyDeleteCallback,
|
||||
PostPackagePolicyPostDeleteCallback,
|
||||
PostPackagePolicyCreateCallback,
|
||||
FleetRequestHandlerContext,
|
||||
PostPackagePolicyPostCreateCallback,
|
||||
|
|
|
@ -122,6 +122,7 @@ export const createPackagePolicyServiceMock = (): jest.Mocked<PackagePolicyClien
|
|||
bulkUpdate: jest.fn(),
|
||||
runExternalCallbacks: jest.fn(),
|
||||
runDeleteExternalCallbacks: jest.fn(),
|
||||
runPostDeleteExternalCallbacks: jest.fn(),
|
||||
upgrade: jest.fn(),
|
||||
getUpgradeDryRunDiff: jest.fn(),
|
||||
getUpgradePackagePolicyInfo: jest.fn(),
|
||||
|
|
|
@ -98,7 +98,7 @@ jest.mock(
|
|||
update: jest.fn(),
|
||||
// @ts-ignore
|
||||
runExternalCallbacks: jest.fn((callbackType, packagePolicy, context, request) =>
|
||||
callbackType === 'postPackagePolicyDelete'
|
||||
callbackType === 'packagePolicyPostDelete'
|
||||
? Promise.resolve(undefined)
|
||||
: Promise.resolve(packagePolicy)
|
||||
),
|
||||
|
|
|
@ -37,7 +37,7 @@ import type {
|
|||
import type {
|
||||
BulkGetPackagePoliciesResponse,
|
||||
CreatePackagePolicyResponse,
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
NewPackagePolicy,
|
||||
UpgradePackagePolicyDryRunResponse,
|
||||
UpgradePackagePolicyResponse,
|
||||
|
@ -50,6 +50,8 @@ import { simplifiedPackagePolicytoNewPackagePolicy } from '../../../common/servi
|
|||
|
||||
import type { SimplifiedPackagePolicy } from '../../../common/services/simplified_package_policy_helper';
|
||||
|
||||
export const isNotNull = <T>(value: T | null): value is T => value !== null;
|
||||
|
||||
export const getPackagePoliciesHandler: FleetRequestHandler<
|
||||
undefined,
|
||||
TypeOf<typeof GetPackagePoliciesRequestSchema.query>
|
||||
|
@ -398,8 +400,30 @@ export const deletePackagePolicyHandler: RequestHandler<
|
|||
const soClient = coreContext.savedObjects.client;
|
||||
const esClient = coreContext.elasticsearch.client.asInternalUser;
|
||||
const user = appContextService.getSecurity()?.authc.getCurrentUser(request) || undefined;
|
||||
const logger = appContextService.getLogger();
|
||||
|
||||
try {
|
||||
const body: DeletePackagePoliciesResponse = await packagePolicyService.delete(
|
||||
try {
|
||||
const packagePolicies = await packagePolicyService.getByIDs(
|
||||
soClient,
|
||||
request.body.packagePolicyIds,
|
||||
{ ignoreMissing: true }
|
||||
);
|
||||
|
||||
if (packagePolicies) {
|
||||
await packagePolicyService.runExternalCallbacks(
|
||||
'packagePolicyDelete',
|
||||
packagePolicies,
|
||||
context,
|
||||
request
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`An error occurred executing external callback: ${error}`);
|
||||
logger.error(error);
|
||||
}
|
||||
|
||||
const body: PostDeletePackagePoliciesResponse = await packagePolicyService.delete(
|
||||
soClient,
|
||||
esClient,
|
||||
request.body.packagePolicyIds,
|
||||
|
@ -407,13 +431,12 @@ export const deletePackagePolicyHandler: RequestHandler<
|
|||
);
|
||||
try {
|
||||
await packagePolicyService.runExternalCallbacks(
|
||||
'postPackagePolicyDelete',
|
||||
'packagePolicyPostDelete',
|
||||
body,
|
||||
context,
|
||||
request
|
||||
);
|
||||
} catch (error) {
|
||||
const logger = appContextService.getLogger();
|
||||
logger.error(`An error occurred executing external callback: ${error}`);
|
||||
logger.error(error);
|
||||
}
|
||||
|
@ -434,7 +457,25 @@ export const deleteOnePackagePolicyHandler: RequestHandler<
|
|||
const soClient = coreContext.savedObjects.client;
|
||||
const esClient = coreContext.elasticsearch.client.asInternalUser;
|
||||
const user = appContextService.getSecurity()?.authc.getCurrentUser(request) || undefined;
|
||||
const logger = appContextService.getLogger();
|
||||
|
||||
try {
|
||||
try {
|
||||
const packagePolicy = await packagePolicyService.get(
|
||||
soClient,
|
||||
request.params.packagePolicyId
|
||||
);
|
||||
await packagePolicyService.runExternalCallbacks(
|
||||
'packagePolicyDelete',
|
||||
packagePolicy ? [packagePolicy] : [],
|
||||
context,
|
||||
request
|
||||
);
|
||||
} catch (error) {
|
||||
logger.error(`An error occurred executing external callback: ${error}`);
|
||||
logger.error(error);
|
||||
}
|
||||
|
||||
const res = await packagePolicyService.delete(
|
||||
soClient,
|
||||
esClient,
|
||||
|
@ -454,13 +495,12 @@ export const deleteOnePackagePolicyHandler: RequestHandler<
|
|||
}
|
||||
try {
|
||||
await packagePolicyService.runExternalCallbacks(
|
||||
'postPackagePolicyDelete',
|
||||
'packagePolicyPostDelete',
|
||||
res,
|
||||
context,
|
||||
request
|
||||
);
|
||||
} catch (error) {
|
||||
const logger = appContextService.getLogger();
|
||||
logger.error(`An error occurred executing external callback: ${error}`);
|
||||
logger.error(error);
|
||||
}
|
||||
|
|
|
@ -171,7 +171,7 @@ describe('agent policy', () => {
|
|||
|
||||
it('should run package policy delete external callbacks', async () => {
|
||||
await agentPolicyService.delete(soClient, esClient, 'mocked');
|
||||
expect(packagePolicyService.runDeleteExternalCallbacks).toHaveBeenCalledWith([
|
||||
expect(packagePolicyService.runPostDeleteExternalCallbacks).toHaveBeenCalledWith([
|
||||
{ id: 'package-1' },
|
||||
]);
|
||||
});
|
||||
|
@ -195,7 +195,7 @@ describe('agent policy', () => {
|
|||
|
||||
await agentPolicyService.delete(soClient, esClient, 'mocked', { force: true });
|
||||
|
||||
expect(packagePolicyService.runDeleteExternalCallbacks).toHaveBeenCalledWith([
|
||||
expect(packagePolicyService.runPostDeleteExternalCallbacks).toHaveBeenCalledWith([
|
||||
{ id: 'package-1' },
|
||||
]);
|
||||
});
|
||||
|
|
|
@ -51,7 +51,7 @@ import type {
|
|||
FleetServerPolicy,
|
||||
Installation,
|
||||
Output,
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
PackageInfo,
|
||||
} from '../../common/types';
|
||||
import {
|
||||
|
@ -680,7 +680,10 @@ class AgentPolicyService {
|
|||
`Cannot delete agent policy ${id} that contains managed package policies`
|
||||
);
|
||||
}
|
||||
const deletedPackagePolicies: DeletePackagePoliciesResponse =
|
||||
|
||||
await packagePolicyService.runDeleteExternalCallbacks(packagePolicies);
|
||||
|
||||
const deletedPackagePolicies: PostDeletePackagePoliciesResponse =
|
||||
await packagePolicyService.delete(
|
||||
soClient,
|
||||
esClient,
|
||||
|
@ -691,7 +694,7 @@ class AgentPolicyService {
|
|||
}
|
||||
);
|
||||
try {
|
||||
await packagePolicyService.runDeleteExternalCallbacks(deletedPackagePolicies);
|
||||
await packagePolicyService.runPostDeleteExternalCallbacks(deletedPackagePolicies);
|
||||
} catch (error) {
|
||||
const logger = appContextService.getLogger();
|
||||
logger.error(`An error occurred executing external callback: ${error}`);
|
||||
|
|
|
@ -35,8 +35,9 @@ import type { ExperimentalFeatures } from '../../common/experimental_features';
|
|||
import type {
|
||||
ExternalCallback,
|
||||
ExternalCallbacksStorage,
|
||||
PostPackagePolicyCreateCallback,
|
||||
PostPackagePolicyDeleteCallback,
|
||||
PostPackagePolicyCreateCallback,
|
||||
PostPackagePolicyPostDeleteCallback,
|
||||
PostPackagePolicyPostCreateCallback,
|
||||
PutPackagePolicyUpdateCallback,
|
||||
} from '../types';
|
||||
|
@ -211,8 +212,10 @@ class AppContextService {
|
|||
| Set<
|
||||
T extends 'packagePolicyCreate'
|
||||
? PostPackagePolicyCreateCallback
|
||||
: T extends 'postPackagePolicyDelete'
|
||||
: T extends 'packagePolicyDelete'
|
||||
? PostPackagePolicyDeleteCallback
|
||||
: T extends 'packagePolicyPostDelete'
|
||||
? PostPackagePolicyPostDeleteCallback
|
||||
: T extends 'packagePolicyPostCreate'
|
||||
? PostPackagePolicyPostCreateCallback
|
||||
: PutPackagePolicyUpdateCallback
|
||||
|
@ -222,8 +225,10 @@ class AppContextService {
|
|||
return this.externalCallbacks.get(type) as Set<
|
||||
T extends 'packagePolicyCreate'
|
||||
? PostPackagePolicyCreateCallback
|
||||
: T extends 'postPackagePolicyDelete'
|
||||
: T extends 'packagePolicyDelete'
|
||||
? PostPackagePolicyDeleteCallback
|
||||
: T extends 'packagePolicyPostDelete'
|
||||
? PostPackagePolicyPostDeleteCallback
|
||||
: T extends 'packagePolicyPostCreate'
|
||||
? PostPackagePolicyPostCreateCallback
|
||||
: PutPackagePolicyUpdateCallback
|
||||
|
|
|
@ -24,11 +24,12 @@ import type {
|
|||
PackageInfo,
|
||||
PackagePolicySOAttributes,
|
||||
AgentPolicySOAttributes,
|
||||
PostPackagePolicyDeleteCallback,
|
||||
PostPackagePolicyPostDeleteCallback,
|
||||
RegistryDataStream,
|
||||
PackagePolicyInputStream,
|
||||
PackagePolicy,
|
||||
PostPackagePolicyPostCreateCallback,
|
||||
PostPackagePolicyDeleteCallback,
|
||||
} from '../types';
|
||||
import { createPackagePolicyMock } from '../../common/mocks';
|
||||
|
||||
|
@ -37,11 +38,12 @@ import type { PutPackagePolicyUpdateCallback, PostPackagePolicyCreateCallback }
|
|||
import { createAppContextStartContractMock, xpackMocks } from '../mocks';
|
||||
|
||||
import type {
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
InputsOverride,
|
||||
NewPackagePolicy,
|
||||
NewPackagePolicyInput,
|
||||
PackagePolicyPackage,
|
||||
DeletePackagePoliciesResponse,
|
||||
} from '../../common/types';
|
||||
import { packageToPackagePolicy } from '../../common/services';
|
||||
|
||||
|
@ -2039,11 +2041,11 @@ describe('Package policy service', () => {
|
|||
it('should allow to delete a package policy', async () => {});
|
||||
});
|
||||
|
||||
describe('runDeleteExternalCallbacks', () => {
|
||||
let callbackOne: jest.MockedFunction<PostPackagePolicyDeleteCallback>;
|
||||
let callbackTwo: jest.MockedFunction<PostPackagePolicyDeleteCallback>;
|
||||
describe('runPostDeleteExternalCallbacks', () => {
|
||||
let callbackOne: jest.MockedFunction<PostPackagePolicyPostDeleteCallback>;
|
||||
let callbackTwo: jest.MockedFunction<PostPackagePolicyPostDeleteCallback>;
|
||||
let callingOrder: string[];
|
||||
let deletedPackagePolicies: DeletePackagePoliciesResponse;
|
||||
let deletedPackagePolicies: PostDeletePackagePoliciesResponse;
|
||||
|
||||
beforeEach(() => {
|
||||
appContextService.start(createAppContextStartContractMock());
|
||||
|
@ -2058,8 +2060,8 @@ describe('Package policy service', () => {
|
|||
callbackTwo = jest.fn(async (deletedPolicies) => {
|
||||
callingOrder.push('two');
|
||||
});
|
||||
appContextService.addExternalCallback('postPackagePolicyDelete', callbackOne);
|
||||
appContextService.addExternalCallback('postPackagePolicyDelete', callbackTwo);
|
||||
appContextService.addExternalCallback('packagePolicyPostDelete', callbackOne);
|
||||
appContextService.addExternalCallback('packagePolicyPostDelete', callbackTwo);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
@ -2067,7 +2069,7 @@ describe('Package policy service', () => {
|
|||
});
|
||||
|
||||
it('should execute external callbacks', async () => {
|
||||
await packagePolicyService.runDeleteExternalCallbacks(deletedPackagePolicies);
|
||||
await packagePolicyService.runPostDeleteExternalCallbacks(deletedPackagePolicies);
|
||||
|
||||
expect(callbackOne).toHaveBeenCalledWith(deletedPackagePolicies);
|
||||
expect(callbackTwo).toHaveBeenCalledWith(deletedPackagePolicies);
|
||||
|
@ -2080,7 +2082,7 @@ describe('Package policy service', () => {
|
|||
throw new Error('foo');
|
||||
});
|
||||
await expect(
|
||||
packagePolicyService.runDeleteExternalCallbacks(deletedPackagePolicies)
|
||||
packagePolicyService.runPostDeleteExternalCallbacks(deletedPackagePolicies)
|
||||
).rejects.toThrow(FleetError);
|
||||
expect(callingOrder).toEqual(['one', 'two']);
|
||||
});
|
||||
|
@ -2099,7 +2101,78 @@ describe('Package policy service', () => {
|
|||
throw callbackTwoError;
|
||||
});
|
||||
|
||||
await packagePolicyService.runDeleteExternalCallbacks(deletedPackagePolicies).catch((e) => {
|
||||
await packagePolicyService
|
||||
.runPostDeleteExternalCallbacks(deletedPackagePolicies)
|
||||
.catch((e) => {
|
||||
error = e;
|
||||
});
|
||||
|
||||
expect(error!.message).toEqual(
|
||||
'2 encountered while executing package post delete external callbacks'
|
||||
);
|
||||
expect(error!.meta).toEqual([callbackOneError, callbackTwoError]);
|
||||
expect(callingOrder).toEqual(['one', 'two']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('runDeleteExternalCallbacks', () => {
|
||||
let callbackOne: jest.MockedFunction<PostPackagePolicyDeleteCallback>;
|
||||
let callbackTwo: jest.MockedFunction<PostPackagePolicyDeleteCallback>;
|
||||
let callingOrder: string[];
|
||||
let packagePolicies: DeletePackagePoliciesResponse;
|
||||
|
||||
beforeEach(() => {
|
||||
appContextService.start(createAppContextStartContractMock());
|
||||
callingOrder = [];
|
||||
packagePolicies = [{ id: 'a' }, { id: 'a' }] as DeletePackagePoliciesResponse;
|
||||
callbackOne = jest.fn(async (deletedPolicies) => {
|
||||
callingOrder.push('one');
|
||||
});
|
||||
callbackTwo = jest.fn(async (deletedPolicies) => {
|
||||
callingOrder.push('two');
|
||||
});
|
||||
appContextService.addExternalCallback('packagePolicyDelete', callbackOne);
|
||||
appContextService.addExternalCallback('packagePolicyDelete', callbackTwo);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
appContextService.stop();
|
||||
});
|
||||
|
||||
it('should execute external callbacks', async () => {
|
||||
await packagePolicyService.runDeleteExternalCallbacks(packagePolicies);
|
||||
|
||||
expect(callbackOne).toHaveBeenCalledWith(packagePolicies);
|
||||
expect(callbackTwo).toHaveBeenCalledWith(packagePolicies);
|
||||
expect(callingOrder).toEqual(['one', 'two']);
|
||||
});
|
||||
|
||||
it("should execute all external callbacks even if one throw's", async () => {
|
||||
callbackOne.mockImplementation(async (deletedPolicies) => {
|
||||
callingOrder.push('one');
|
||||
throw new Error('foo');
|
||||
});
|
||||
await expect(
|
||||
packagePolicyService.runDeleteExternalCallbacks(packagePolicies)
|
||||
).rejects.toThrow(FleetError);
|
||||
expect(callingOrder).toEqual(['one', 'two']);
|
||||
});
|
||||
|
||||
it('should provide an array of errors encountered by running external callbacks', async () => {
|
||||
let error: FleetError;
|
||||
const callbackOneError = new Error('foo 1');
|
||||
const callbackTwoError = new Error('foo 2');
|
||||
|
||||
callbackOne.mockImplementation(async (deletedPolicies) => {
|
||||
callingOrder.push('one');
|
||||
throw callbackOneError;
|
||||
});
|
||||
callbackTwo.mockImplementation(async (deletedPolicies) => {
|
||||
callingOrder.push('two');
|
||||
throw callbackTwoError;
|
||||
});
|
||||
|
||||
await packagePolicyService.runDeleteExternalCallbacks(packagePolicies).catch((e) => {
|
||||
error = e;
|
||||
});
|
||||
|
||||
|
@ -2286,7 +2359,7 @@ describe('Package policy service', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('runPostPackagePolicyPostCreateCallback', () => {
|
||||
describe('runPackagePolicyPostCreateCallback', () => {
|
||||
let context: ReturnType<typeof xpackMocks.createRequestHandlerContext>;
|
||||
let request: KibanaRequest;
|
||||
const packagePolicy = {
|
||||
|
|
|
@ -44,7 +44,7 @@ import {
|
|||
PACKAGES_SAVED_OBJECT_TYPE,
|
||||
} from '../../common/constants';
|
||||
import type {
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
UpgradePackagePolicyResponse,
|
||||
PackagePolicyInput,
|
||||
NewPackagePolicyInput,
|
||||
|
@ -58,6 +58,7 @@ import type {
|
|||
PackagePolicyPackage,
|
||||
Installation,
|
||||
ExperimentalDataStreamFeature,
|
||||
DeletePackagePoliciesResponse,
|
||||
} from '../../common/types';
|
||||
import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../constants';
|
||||
import {
|
||||
|
@ -691,8 +692,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient {
|
|||
esClient: ElasticsearchClient,
|
||||
ids: string[],
|
||||
options?: { user?: AuthenticatedUser; skipUnassignFromAgentPolicies?: boolean; force?: boolean }
|
||||
): Promise<DeletePackagePoliciesResponse> {
|
||||
const result: DeletePackagePoliciesResponse = [];
|
||||
): Promise<PostDeletePackagePoliciesResponse> {
|
||||
const result: PostDeletePackagePoliciesResponse = [];
|
||||
|
||||
const packagePolicies = await this.getByIDs(soClient, ids, { ignoreMissing: true });
|
||||
if (!packagePolicies) {
|
||||
|
@ -1205,15 +1206,19 @@ class PackagePolicyClientImpl implements PackagePolicyClient {
|
|||
|
||||
public async runExternalCallbacks<A extends ExternalCallback[0]>(
|
||||
externalCallbackType: A,
|
||||
packagePolicy: A extends 'postPackagePolicyDelete'
|
||||
packagePolicy: A extends 'packagePolicyDelete'
|
||||
? DeletePackagePoliciesResponse
|
||||
: A extends 'packagePolicyPostDelete'
|
||||
? PostDeletePackagePoliciesResponse
|
||||
: A extends 'packagePolicyPostCreate'
|
||||
? PackagePolicy
|
||||
: NewPackagePolicy,
|
||||
context: RequestHandlerContext,
|
||||
request: KibanaRequest
|
||||
): Promise<
|
||||
A extends 'postPackagePolicyDelete'
|
||||
A extends 'packagePolicyDelete'
|
||||
? void
|
||||
: A extends 'packagePolicyPostDelete'
|
||||
? void
|
||||
: A extends 'packagePolicyPostCreate'
|
||||
? PackagePolicy
|
||||
|
@ -1221,11 +1226,19 @@ class PackagePolicyClientImpl implements PackagePolicyClient {
|
|||
>;
|
||||
public async runExternalCallbacks(
|
||||
externalCallbackType: ExternalCallback[0],
|
||||
packagePolicy: PackagePolicy | NewPackagePolicy | DeletePackagePoliciesResponse,
|
||||
packagePolicy:
|
||||
| PackagePolicy
|
||||
| NewPackagePolicy
|
||||
| PostDeletePackagePoliciesResponse
|
||||
| DeletePackagePoliciesResponse,
|
||||
context: RequestHandlerContext,
|
||||
request: KibanaRequest
|
||||
): Promise<PackagePolicy | NewPackagePolicy | void> {
|
||||
if (externalCallbackType === 'postPackagePolicyDelete') {
|
||||
if (externalCallbackType === 'packagePolicyPostDelete') {
|
||||
return await this.runPostDeleteExternalCallbacks(
|
||||
packagePolicy as PostDeletePackagePoliciesResponse
|
||||
);
|
||||
} else if (externalCallbackType === 'packagePolicyDelete') {
|
||||
return await this.runDeleteExternalCallbacks(packagePolicy as DeletePackagePoliciesResponse);
|
||||
} else {
|
||||
if (!Array.isArray(packagePolicy)) {
|
||||
|
@ -1263,10 +1276,10 @@ class PackagePolicyClientImpl implements PackagePolicyClient {
|
|||
}
|
||||
}
|
||||
|
||||
public async runDeleteExternalCallbacks(
|
||||
deletedPackagePolicies: DeletePackagePoliciesResponse
|
||||
public async runPostDeleteExternalCallbacks(
|
||||
deletedPackagePolicies: PostDeletePackagePoliciesResponse
|
||||
): Promise<void> {
|
||||
const externalCallbacks = appContextService.getExternalCallbacks('postPackagePolicyDelete');
|
||||
const externalCallbacks = appContextService.getExternalCallbacks('packagePolicyPostDelete');
|
||||
const errorsThrown: Error[] = [];
|
||||
|
||||
if (externalCallbacks && externalCallbacks.size > 0) {
|
||||
|
@ -1280,6 +1293,32 @@ class PackagePolicyClientImpl implements PackagePolicyClient {
|
|||
}
|
||||
}
|
||||
|
||||
if (errorsThrown.length > 0) {
|
||||
throw new FleetError(
|
||||
`${errorsThrown.length} encountered while executing package post delete external callbacks`,
|
||||
errorsThrown
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async runDeleteExternalCallbacks(
|
||||
deletedPackagePolices: DeletePackagePoliciesResponse
|
||||
): Promise<void> {
|
||||
const externalCallbacks = appContextService.getExternalCallbacks('packagePolicyDelete');
|
||||
const errorsThrown: Error[] = [];
|
||||
|
||||
if (externalCallbacks && externalCallbacks.size > 0) {
|
||||
for (const callback of externalCallbacks) {
|
||||
// Failures from an external callback should not prevent other external callbacks from being
|
||||
// executed. Errors (if any) will be collected and `throw`n after processing the entire set
|
||||
try {
|
||||
await callback(deletedPackagePolices);
|
||||
} catch (error) {
|
||||
errorsThrown.push(error);
|
||||
}
|
||||
}
|
||||
|
||||
if (errorsThrown.length > 0) {
|
||||
throw new FleetError(
|
||||
`${errorsThrown.length} encountered while executing package delete external callbacks`,
|
||||
|
|
|
@ -14,14 +14,17 @@ import type {
|
|||
import type { AuthenticatedUser } from '@kbn/security-plugin/server';
|
||||
|
||||
import type {
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
UpgradePackagePolicyResponse,
|
||||
PackageInfo,
|
||||
ListWithKuery,
|
||||
ListResult,
|
||||
UpgradePackagePolicyDryRunResponseItem,
|
||||
} from '../../common';
|
||||
import type { ExperimentalDataStreamFeature } from '../../common/types';
|
||||
import type {
|
||||
DeletePackagePoliciesResponse,
|
||||
ExperimentalDataStreamFeature,
|
||||
} from '../../common/types';
|
||||
import type { NewPackagePolicy, UpdatePackagePolicy, PackagePolicy } from '../types';
|
||||
import type { ExternalCallback } from '..';
|
||||
|
||||
|
@ -106,7 +109,7 @@ export interface PackagePolicyClient {
|
|||
esClient: ElasticsearchClient,
|
||||
ids: string[],
|
||||
options?: { user?: AuthenticatedUser; skipUnassignFromAgentPolicies?: boolean; force?: boolean }
|
||||
): Promise<DeletePackagePoliciesResponse>;
|
||||
): Promise<PostDeletePackagePoliciesResponse>;
|
||||
|
||||
upgrade(
|
||||
soClient: SavedObjectsClientContract,
|
||||
|
@ -137,15 +140,19 @@ export interface PackagePolicyClient {
|
|||
|
||||
runExternalCallbacks<A extends ExternalCallback[0]>(
|
||||
externalCallbackType: A,
|
||||
packagePolicy: A extends 'postPackagePolicyDelete'
|
||||
packagePolicy: A extends 'packagePolicyDelete'
|
||||
? DeletePackagePoliciesResponse
|
||||
: A extends 'packagePolicyPostDelete'
|
||||
? PostDeletePackagePoliciesResponse
|
||||
: A extends 'packagePolicyPostCreate'
|
||||
? PackagePolicy
|
||||
: NewPackagePolicy,
|
||||
context: RequestHandlerContext,
|
||||
request: KibanaRequest
|
||||
): Promise<
|
||||
A extends 'postPackagePolicyDelete'
|
||||
A extends 'packagePolicyDelete'
|
||||
? void
|
||||
: A extends 'packagePolicyPostDelete'
|
||||
? void
|
||||
: A extends 'packagePolicyPostCreate'
|
||||
? PackagePolicy
|
||||
|
@ -154,6 +161,10 @@ export interface PackagePolicyClient {
|
|||
|
||||
runDeleteExternalCallbacks(deletedPackagePolicies: DeletePackagePoliciesResponse): Promise<void>;
|
||||
|
||||
runPostDeleteExternalCallbacks(
|
||||
deletedPackagePolicies: PostDeletePackagePoliciesResponse
|
||||
): Promise<void>;
|
||||
|
||||
getUpgradePackagePolicyInfo(
|
||||
soClient: SavedObjectsClientContract,
|
||||
id: string
|
||||
|
|
|
@ -10,14 +10,19 @@ import type { KibanaRequest, RequestHandlerContext } from '@kbn/core/server';
|
|||
import type { DeepReadonly } from 'utility-types';
|
||||
|
||||
import type {
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
NewPackagePolicy,
|
||||
UpdatePackagePolicy,
|
||||
PackagePolicy,
|
||||
DeletePackagePoliciesResponse,
|
||||
} from '../../common/types';
|
||||
|
||||
export type PostPackagePolicyDeleteCallback = (
|
||||
deletedPackagePolicies: DeepReadonly<DeletePackagePoliciesResponse>
|
||||
packagePolicies: DeletePackagePoliciesResponse
|
||||
) => Promise<void>;
|
||||
|
||||
export type PostPackagePolicyPostDeleteCallback = (
|
||||
deletedPackagePolicies: DeepReadonly<PostDeletePackagePoliciesResponse>
|
||||
) => Promise<void>;
|
||||
|
||||
export type PostPackagePolicyCreateCallback = (
|
||||
|
@ -43,7 +48,12 @@ export type ExternalCallbackPostCreate = [
|
|||
'packagePolicyPostCreate',
|
||||
PostPackagePolicyPostCreateCallback
|
||||
];
|
||||
export type ExternalCallbackDelete = ['postPackagePolicyDelete', PostPackagePolicyDeleteCallback];
|
||||
|
||||
export type ExternalCallbackDelete = ['packagePolicyDelete', PostPackagePolicyDeleteCallback];
|
||||
export type ExternalCallbackPostDelete = [
|
||||
'packagePolicyPostDelete',
|
||||
PostPackagePolicyPostDeleteCallback
|
||||
];
|
||||
export type ExternalCallbackUpdate = ['packagePolicyUpdate', PutPackagePolicyUpdateCallback];
|
||||
|
||||
/**
|
||||
|
@ -53,6 +63,7 @@ export type ExternalCallback =
|
|||
| ExternalCallbackCreate
|
||||
| ExternalCallbackPostCreate
|
||||
| ExternalCallbackDelete
|
||||
| ExternalCallbackPostDelete
|
||||
| ExternalCallbackUpdate;
|
||||
|
||||
export type ExternalCallbacksStorage = Map<ExternalCallback[0], Set<ExternalCallback[1]>>;
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
|
||||
import type { SavedObjectReference, SavedObjectsClient } from '@kbn/core/server';
|
||||
import { filter, map } from 'lodash';
|
||||
import type { PostPackagePolicyDeleteCallback } from '@kbn/fleet-plugin/server';
|
||||
import type { PostPackagePolicyPostDeleteCallback } from '@kbn/fleet-plugin/server';
|
||||
import { AGENT_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common';
|
||||
import { packSavedObjectType } from '../../common/types';
|
||||
import { OSQUERY_INTEGRATION_NAME } from '../../common';
|
||||
|
||||
export const getPackagePolicyDeleteCallback =
|
||||
(packsClient: SavedObjectsClient): PostPackagePolicyDeleteCallback =>
|
||||
(packsClient: SavedObjectsClient): PostPackagePolicyPostDeleteCallback =>
|
||||
async (deletedPackagePolicy) => {
|
||||
const deletedOsqueryManagerPolicies = filter(deletedPackagePolicy, [
|
||||
'package.name',
|
||||
|
|
|
@ -160,7 +160,7 @@ export class OsqueryPlugin implements Plugin<OsqueryPluginSetup, OsqueryPluginSt
|
|||
}
|
||||
);
|
||||
|
||||
registerIngestCallback('postPackagePolicyDelete', getPackagePolicyDeleteCallback(client));
|
||||
registerIngestCallback('packagePolicyPostDelete', getPackagePolicyDeleteCallback(client));
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ import type {
|
|||
CreatePackagePolicyRequest,
|
||||
CreatePackagePolicyResponse,
|
||||
DeleteAgentPolicyResponse,
|
||||
DeletePackagePoliciesResponse,
|
||||
PostDeletePackagePoliciesResponse,
|
||||
} from '@kbn/fleet-plugin/common';
|
||||
import { AGENT_POLICY_API_ROUTES, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common';
|
||||
import type { PolicyData } from '../types';
|
||||
|
@ -102,7 +102,7 @@ export const indexFleetEndpointPolicy = async (
|
|||
};
|
||||
|
||||
export interface DeleteIndexedFleetEndpointPoliciesResponse {
|
||||
integrationPolicies: DeletePackagePoliciesResponse | undefined;
|
||||
integrationPolicies: PostDeletePackagePoliciesResponse | undefined;
|
||||
agentPolicies: DeleteAgentPolicyResponse[] | undefined;
|
||||
}
|
||||
|
||||
|
@ -132,7 +132,7 @@ export const deleteIndexedFleetEndpointPolicies = async (
|
|||
packagePolicyIds: indexData.integrationPolicies.map((policy) => policy.id),
|
||||
},
|
||||
})
|
||||
.catch(wrapErrorAndRejectPromise)) as AxiosResponse<DeletePackagePoliciesResponse>
|
||||
.catch(wrapErrorAndRejectPromise)) as AxiosResponse<PostDeletePackagePoliciesResponse>
|
||||
).data;
|
||||
}
|
||||
|
||||
|
|
|
@ -140,7 +140,7 @@ export class EndpointAppContextService {
|
|||
);
|
||||
|
||||
registerIngestCallback(
|
||||
'postPackagePolicyDelete',
|
||||
'packagePolicyPostDelete',
|
||||
getPackagePolicyDeleteCallback(exceptionListsClient)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ import { getMockArtifacts, toArtifactRecords } from '../endpoint/lib/artifacts/m
|
|||
import { Manifest } from '../endpoint/lib/artifacts';
|
||||
import type { NewPackagePolicy, PackagePolicy } from '@kbn/fleet-plugin/common/types/models';
|
||||
import type { ManifestSchema } from '../../common/endpoint/schema/manifest';
|
||||
import type { DeletePackagePoliciesResponse } from '@kbn/fleet-plugin/common';
|
||||
import type { PostDeletePackagePoliciesResponse } from '@kbn/fleet-plugin/common';
|
||||
import { createMockPolicyData } from '../endpoint/services/feature_usage/mocks';
|
||||
import { ALL_ENDPOINT_ARTIFACT_LIST_IDS } from '../../common/endpoint/service/artifacts/constants';
|
||||
import { ENDPOINT_EVENT_FILTERS_LIST_ID } from '@kbn/securitysolution-list-constants';
|
||||
|
@ -396,7 +396,7 @@ describe('ingest_integration tests ', () => {
|
|||
await callback(deletePackagePolicyMock());
|
||||
};
|
||||
|
||||
let removedPolicies: DeletePackagePoliciesResponse;
|
||||
let removedPolicies: PostDeletePackagePoliciesResponse;
|
||||
let policyId: string;
|
||||
let fakeArtifact: ExceptionListSchema;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ import type { ExceptionListClient } from '@kbn/lists-plugin/server';
|
|||
import type { PluginStartContract as AlertsStartContract } from '@kbn/alerting-plugin/server';
|
||||
import type {
|
||||
PostPackagePolicyCreateCallback,
|
||||
PostPackagePolicyDeleteCallback,
|
||||
PostPackagePolicyPostDeleteCallback,
|
||||
PutPackagePolicyUpdateCallback,
|
||||
PostPackagePolicyPostCreateCallback,
|
||||
} from '@kbn/fleet-plugin/server';
|
||||
|
@ -190,7 +190,7 @@ export const getPackagePolicyPostCreateCallback = (
|
|||
|
||||
export const getPackagePolicyDeleteCallback = (
|
||||
exceptionsClient: ExceptionListClient | undefined
|
||||
): PostPackagePolicyDeleteCallback => {
|
||||
): PostPackagePolicyPostDeleteCallback => {
|
||||
return async (deletePackagePolicy): Promise<void> => {
|
||||
if (!exceptionsClient) {
|
||||
return;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import pMap from 'p-map';
|
||||
|
||||
import type { ExceptionListClient } from '@kbn/lists-plugin/server';
|
||||
import type { PostPackagePolicyDeleteCallback } from '@kbn/fleet-plugin/server';
|
||||
import type { PostPackagePolicyPostDeleteCallback } from '@kbn/fleet-plugin/server';
|
||||
import { ALL_ENDPOINT_ARTIFACT_LIST_IDS } from '../../../common/endpoint/service/artifacts/constants';
|
||||
|
||||
/**
|
||||
|
@ -16,7 +16,7 @@ import { ALL_ENDPOINT_ARTIFACT_LIST_IDS } from '../../../common/endpoint/service
|
|||
*/
|
||||
export const removePolicyFromArtifacts = async (
|
||||
exceptionsClient: ExceptionListClient,
|
||||
policy: Parameters<PostPackagePolicyDeleteCallback>[0][0]
|
||||
policy: Parameters<PostPackagePolicyPostDeleteCallback>[0][0]
|
||||
) => {
|
||||
let page = 1;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue