Skip to content

Commit

Permalink
[APM] Use callWithInternalUser for agent configuration endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
dgieselaar committed Nov 12, 2019
1 parent 19f7e99 commit 9218162
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 30 deletions.
2 changes: 1 addition & 1 deletion x-pack/legacy/plugins/apm/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ export const apm: LegacyPluginInitializer = kibana => {
catalogue: ['apm'],
privileges: {
all: {
api: ['apm'],
api: ['apm', 'apm_write'],
catalogue: ['apm'],
savedObject: {
all: [],
Expand Down
29 changes: 20 additions & 9 deletions x-pack/legacy/plugins/apm/server/lib/helpers/es_client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,23 @@ interface APMOptions {
includeLegacyData: boolean;
}

export function getESClient(req: Legacy.Request) {
interface ClientCreateOptions {
asInternalUser?: boolean;
}

export type ESClient = ReturnType<typeof getESClient>;

export function getESClient(
req: Legacy.Request,
{ asInternalUser = false }: ClientCreateOptions = {}
) {
const cluster = req.server.plugins.elasticsearch.getCluster('data');
const query = req.query as Record<string, unknown>;

const callMethod = asInternalUser
? cluster.callWithInternalUser
: cluster.callWithRequest.bind(cluster, req);

return {
search: async <
TDocument = unknown,
Expand All @@ -121,20 +134,18 @@ export function getESClient(req: Legacy.Request) {
console.log(JSON.stringify(nextParams.body, null, 4));
}

return (cluster.callWithRequest(
req,
'search',
nextParams
) as unknown) as Promise<ESSearchResponse<TDocument, TSearchRequest>>;
return (callMethod('search', nextParams) as unknown) as Promise<
ESSearchResponse<TDocument, TSearchRequest>
>;
},
index: <Body>(params: APMIndexDocumentParams<Body>) => {
return cluster.callWithRequest(req, 'index', params);
return callMethod('index', params);
},
delete: (params: IndicesDeleteParams) => {
return cluster.callWithRequest(req, 'delete', params);
return callMethod('delete', params);
},
indicesCreate: (params: IndicesCreateParams) => {
return cluster.callWithRequest(req, 'indices.create', params);
return callMethod('indices.create', params);
}
};
}
11 changes: 9 additions & 2 deletions x-pack/legacy/plugins/apm/server/lib/helpers/setup_request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,15 @@ export interface APMRequestQuery {
uiFilters?: string;
}

interface SetupOptions {
clientAsInternalUser?: boolean;
}

export type Setup = PromiseReturnType<typeof setupRequest>;
export async function setupRequest(req: Legacy.Request) {
export async function setupRequest(
req: Legacy.Request,
{ clientAsInternalUser = false }: SetupOptions = {}
) {
const query = (req.query as unknown) as APMRequestQuery;
const { server } = req;
const config = server.config();
Expand All @@ -41,7 +48,7 @@ export async function setupRequest(req: Legacy.Request) {
start: moment.utc(query.start).valueOf(),
end: moment.utc(query.end).valueOf(),
uiFiltersES,
client: getESClient(req),
client: getESClient(req, { asInternalUser: clientAsInternalUser }),
config,
indices
};
Expand Down
21 changes: 20 additions & 1 deletion x-pack/legacy/plugins/apm/server/routes/create_api/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,17 @@ describe('createApi', () => {
},
handler: async () => null
}))
.add(() => ({
path: '/baz',
method: 'PUT',
options: {
tags: ['access:apm', 'access:apm_write']
},
handler: async () => null
}))
.init(coreMock);

expect(coreMock.http.server.route).toHaveBeenCalledTimes(2);
expect(coreMock.http.server.route).toHaveBeenCalledTimes(3);

const firstRoute = coreMock.http.server.route.mock.calls[0][0];

Expand All @@ -61,6 +69,17 @@ describe('createApi', () => {
path: '/bar',
handler: expect.any(Function)
});

const thirdRoute = coreMock.http.server.route.mock.calls[2][0];

expect(thirdRoute).toEqual({
method: 'PUT',
options: {
tags: ['access:apm', 'access:apm_write']
},
path: '/baz',
handler: expect.any(Function)
});
});

describe('when validating', () => {
Expand Down
15 changes: 6 additions & 9 deletions x-pack/legacy/plugins/apm/server/routes/create_api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,11 @@ export function createApi() {
init(core: InternalCoreSetup) {
const { server } = core.http;
factoryFns.forEach(fn => {
const { params = {}, ...route } = fn(core) as Route<
string,
HttpMethod,
Params,
any
>;
const {
params = {},
options = { tags: ['access:apm'] },
...route
} = fn(core) as Route<string, HttpMethod, Params, any>;

const bodyRt = params.body;
const fallbackBodyRt = bodyRt || t.null;
Expand All @@ -54,9 +53,7 @@ export function createApi() {
server.route(
merge(
{
options: {
tags: ['access:apm']
},
options,
method: 'GET'
},
route,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { markAppliedByAgent } from '../../lib/settings/agent_configuration/mark_
export const agentConfigurationRoute = createRoute(core => ({
path: '/api/apm/settings/agent-configuration',
handler: async req => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
return await listConfigurations({ setup });
}
}));
Expand All @@ -31,13 +31,16 @@ export const agentConfigurationRoute = createRoute(core => ({
export const deleteAgentConfigurationRoute = createRoute(() => ({
method: 'DELETE',
path: '/api/apm/settings/agent-configuration/{configurationId}',
options: {
tags: ['access:apm', 'access:apm_write']
},
params: {
path: t.type({
configurationId: t.string
})
},
handler: async (req, { path }) => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
const { configurationId } = path;
return await deleteConfiguration({
configurationId,
Expand All @@ -51,7 +54,7 @@ export const listAgentConfigurationServicesRoute = createRoute(() => ({
method: 'GET',
path: '/api/apm/settings/agent-configuration/services',
handler: async req => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
return await getServiceNames({
setup
});
Expand Down Expand Up @@ -82,7 +85,7 @@ export const listAgentConfigurationEnvironmentsRoute = createRoute(() => ({
query: t.partial({ serviceName: t.string })
},
handler: async (req, { query }) => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
const { serviceName } = query;
return await getEnvironments({ serviceName, setup });
}
Expand All @@ -95,7 +98,7 @@ export const agentConfigurationAgentNameRoute = createRoute(() => ({
query: t.type({ serviceName: t.string })
},
handler: async (req, { query }) => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
const { serviceName } = query;
const agentName = await getAgentNameByService({ serviceName, setup });
return agentName;
Expand All @@ -108,23 +111,29 @@ export const createAgentConfigurationRoute = createRoute(() => ({
params: {
body: agentPayloadRt
},
options: {
tags: ['access:apm', 'access:apm_write']
},
handler: async (req, { body }) => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
return await createOrUpdateConfiguration({ configuration: body, setup });
}
}));

export const updateAgentConfigurationRoute = createRoute(() => ({
method: 'PUT',
path: '/api/apm/settings/agent-configuration/{configurationId}',
options: {
tags: ['access:apm', 'access:apm_write']
},
params: {
path: t.type({
configurationId: t.string
}),
body: agentPayloadRt
},
handler: async (req, { path, body }) => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
const { configurationId } = path;
return await createOrUpdateConfiguration({
configurationId,
Expand All @@ -148,7 +157,7 @@ export const agentConfigurationSearchRoute = createRoute(core => ({
})
},
handler: async (req, { body }, h) => {
const setup = await setupRequest(req);
const setup = await setupRequest(req, { clientAsInternalUser: true });
const config = await searchConfigurations({
serviceName: body.service.name,
environment: body.service.environment,
Expand Down
3 changes: 3 additions & 0 deletions x-pack/legacy/plugins/apm/server/routes/typings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ export interface Route<
path: TPath;
method?: TMethod;
params?: TParams;
options?: {
tags: Array<'access:apm' | 'access:apm_write'>;
};
handler: (
req: Request,
params: DecodeParams<TParams>,
Expand Down

0 comments on commit 9218162

Please sign in to comment.