-
Notifications
You must be signed in to change notification settings - Fork 8.5k
[Security Solution][Endpoint][Admin][Policy List] GET endpoint package policy api #119545
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
74ba729
b195533
a0e7470
b4cbe40
074a51f
efb6b85
06fc5cb
dbd2072
e8497a1
8df1bc9
7f672d3
c4b4845
d52464a
c885bb5
7405ead
7c189d1
d1e827a
14980a1
7a7ae9b
1695276
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,8 +11,17 @@ import { | |
| createMockEndpointAppContextServiceStartContract, | ||
| createRouteHandlerContext, | ||
| } from '../../mocks'; | ||
| import { createMockAgentClient, createMockAgentService } from '../../../../../fleet/server/mocks'; | ||
| import { getHostPolicyResponseHandler, getAgentPolicySummaryHandler } from './handlers'; | ||
| import { | ||
| createMockAgentClient, | ||
| createMockAgentService, | ||
| createPackagePolicyServiceMock, | ||
| } from '../../../../../fleet/server/mocks'; | ||
| import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../../../fleet/common'; | ||
| import { | ||
| getHostPolicyResponseHandler, | ||
| getAgentPolicySummaryHandler, | ||
| getPolicyListHandler, | ||
| } from './handlers'; | ||
| import { | ||
| KibanaResponseFactory, | ||
| SavedObjectsClientContract, | ||
|
|
@@ -33,6 +42,7 @@ import { AgentClient, AgentService } from '../../../../../fleet/server/services' | |
| import { get } from 'lodash'; | ||
| // eslint-disable-next-line @kbn/eslint/no-restricted-paths | ||
| import { ScopedClusterClientMock } from '../../../../../../../src/core/server/elasticsearch/client/mocks'; | ||
| import { PackagePolicyServiceInterface } from '../../../../../fleet/server'; | ||
|
|
||
| describe('test policy response handler', () => { | ||
| let endpointAppContextService: EndpointAppContextService; | ||
|
|
@@ -236,6 +246,80 @@ describe('test policy response handler', () => { | |
| }); | ||
| }); | ||
| }); | ||
| describe('test GET policy list handler', () => { | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we should add some integration tests as well. I'm guessing in here: https://github.com/elastic/kibana/blob/main/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts. |
||
| let mockPackagePolicyService: jest.Mocked<PackagePolicyServiceInterface>; | ||
| let policyHandler: ReturnType<typeof getPolicyListHandler>; | ||
|
|
||
| beforeEach(() => { | ||
| mockScopedClient = elasticsearchServiceMock.createScopedClusterClient(); | ||
| mockSavedObjectClient = savedObjectsClientMock.create(); | ||
| mockResponse = httpServerMock.createResponseFactory(); | ||
| mockPackagePolicyService = createPackagePolicyServiceMock(); | ||
| mockPackagePolicyService.list.mockImplementation(() => { | ||
| return Promise.resolve({ | ||
| items: [], | ||
| total: 0, | ||
| page: 1, | ||
| perPage: 10, | ||
| }); | ||
| }); | ||
| endpointAppContextService = new EndpointAppContextService(); | ||
| endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); | ||
| endpointAppContextService.start({ | ||
| ...createMockEndpointAppContextServiceStartContract(), | ||
| ...{ packagePolicyService: mockPackagePolicyService }, | ||
| }); | ||
| policyHandler = getPolicyListHandler({ | ||
| logFactory: loggingSystemMock.create(), | ||
| service: endpointAppContextService, | ||
| config: () => Promise.resolve(createMockConfig()), | ||
| experimentalFeatures: parseExperimentalConfigValue(createMockConfig().enableExperimental), | ||
| }); | ||
| }); | ||
|
|
||
| afterEach(() => endpointAppContextService.stop()); | ||
|
|
||
| it('should return a list of endpoint package policies', async () => { | ||
| const mockRequest = httpServerMock.createKibanaRequest({ | ||
| query: {}, | ||
| }); | ||
|
|
||
| await policyHandler( | ||
| createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), | ||
| mockRequest, | ||
| mockResponse | ||
| ); | ||
| expect(mockPackagePolicyService.list.mock.calls[0][1]).toEqual({ | ||
| kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, | ||
| perPage: undefined, | ||
| sortField: undefined, | ||
| }); | ||
| expect(mockResponse.ok).toBeCalled(); | ||
| expect(mockResponse.ok.mock.calls[0][0]?.body).toEqual({ | ||
| items: [], | ||
| total: 0, | ||
| page: 1, | ||
| perPage: 10, | ||
| }); | ||
| }); | ||
|
|
||
| it('should add endpoint-specific kuery to the requests kuery', async () => { | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would be good to also add tests for the other query params too. |
||
| const mockRequest = httpServerMock.createKibanaRequest({ | ||
| query: { kuery: 'some query' }, | ||
| }); | ||
|
|
||
| await policyHandler( | ||
| createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), | ||
| mockRequest, | ||
| mockResponse | ||
| ); | ||
| expect(mockPackagePolicyService.list.mock.calls[0][1]).toEqual({ | ||
| kuery: `(some query) and ${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, | ||
| perPage: undefined, | ||
| sortField: undefined, | ||
| }); | ||
| }); | ||
| }); | ||
| }); | ||
|
|
||
| /** | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -11,10 +11,13 @@ import { policyIndexPattern } from '../../../../common/endpoint/constants'; | |||||||
| import { | ||||||||
| GetPolicyResponseSchema, | ||||||||
| GetAgentPolicySummaryRequestSchema, | ||||||||
| GetEndpointPackagePolicyRequestSchema, | ||||||||
| } from '../../../../common/endpoint/schema/policy'; | ||||||||
| import { EndpointAppContext } from '../../types'; | ||||||||
| import { getAgentPolicySummary, getPolicyResponseByAgentId } from './service'; | ||||||||
| import { GetAgentSummaryResponse } from '../../../../common/endpoint/types'; | ||||||||
| import { wrapErrorIfNeeded } from '../../utils'; | ||||||||
| import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../../../fleet/common'; | ||||||||
|
|
||||||||
| export const getHostPolicyResponseHandler = function (): RequestHandler< | ||||||||
| undefined, | ||||||||
|
|
@@ -64,3 +67,33 @@ export const getAgentPolicySummaryHandler = function ( | |||||||
| }); | ||||||||
| }; | ||||||||
| }; | ||||||||
|
|
||||||||
| export const getPolicyListHandler = function ( | ||||||||
| endpointAppContext: EndpointAppContext | ||||||||
| ): RequestHandler< | ||||||||
| undefined, | ||||||||
| TypeOf<typeof GetEndpointPackagePolicyRequestSchema.query>, | ||||||||
| undefined | ||||||||
| > { | ||||||||
| return async (context, request, response) => { | ||||||||
| const soClient = context.core.savedObjects.client; | ||||||||
| const fleetServices = endpointAppContext.service.getScopedFleetServices(request); | ||||||||
| const endpointFilteredKuery = `${ | ||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This does not look correct - you need to ensure that both side of the
Suggested change
Here is a test that you can do to see why this is important (note: i did not actually execute this, but you should be able to and get the results I'm thinking you should get):
This will likely match and return package policies for
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I worked with @parkiino yesterday on this and we validated that what i thought was going to happen (retrieval of non-endpoint package policies) did not actually happen. that's because even if a user of the API ends their |
||||||||
| request?.query?.kuery ? `(${request.query.kuery}) and ` : '' | ||||||||
| }${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`; | ||||||||
| try { | ||||||||
| const listResponse = await fleetServices.packagePolicy.list(soClient, { | ||||||||
| ...request.query, | ||||||||
| perPage: request.query.pageSize, | ||||||||
| sortField: request.query.sort, | ||||||||
| kuery: endpointFilteredKuery, | ||||||||
| }); | ||||||||
|
|
||||||||
| return response.ok({ | ||||||||
| body: listResponse, | ||||||||
| }); | ||||||||
| } catch (error) { | ||||||||
| throw wrapErrorIfNeeded(error); | ||||||||
| } | ||||||||
| }; | ||||||||
| }; | ||||||||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
would be good to add tests for these. I have a suspicion that these default values might not work since they're wrapped in a maybe.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
example schema tests: https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/endpoint/schema/metadata.test.ts.