[Fleet] Fix agent status count (#95099)

This commit is contained in:
Nicolas Chaulet 2021-03-23 11:24:25 -04:00 committed by GitHub
parent c0c5fba4b0
commit 76b55207f7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 92 additions and 2 deletions

View file

@ -9,6 +9,7 @@ import Boom from '@hapi/boom';
import type { SearchResponse, MGetResponse, GetResponse } from 'elasticsearch';
import type { SavedObjectsClientContract, ElasticsearchClient } from 'src/core/server';
import type { ESSearchResponse } from '../../../../../../typings/elasticsearch';
import type { AgentSOAttributes, Agent, ListWithKuery } from '../../types';
import { appContextService, agentPolicyService } from '../../services';
import type { FleetServerAgent } from '../../../common';
@ -118,7 +119,7 @@ export async function getAgentsByKuery(
const kueryNode = _joinFilters(filters);
const body = kueryNode ? { query: esKuery.toElasticsearchQuery(kueryNode) } : {};
const res = await esClient.search<SearchResponse<FleetServerAgent>>({
const res = await esClient.search<ESSearchResponse<FleetServerAgent, {}>>({
index: AGENTS_INDEX,
from: (page - 1) * perPage,
size: perPage,
@ -138,7 +139,7 @@ export async function getAgentsByKuery(
return {
agents,
total: agents.length,
total: res.body.hits.total.value,
page,
perPage,
};

View file

@ -7,10 +7,12 @@
import type { GetResponse, SearchResponse } from 'elasticsearch';
import type { ESSearchHit } from '../../../../../../typings/elasticsearch';
import type { Agent, AgentSOAttributes, FleetServerAgent } from '../../types';
type FleetServerAgentESResponse =
| GetResponse<FleetServerAgent>
| ESSearchHit<FleetServerAgent>
| SearchResponse<FleetServerAgent>['hits']['hits'][0];
export function searchHitToAgent(hit: FleetServerAgentESResponse): Agent {

View file

@ -0,0 +1,86 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import expect from '@kbn/expect';
import { FtrProviderContext } from '../../../api_integration/ftr_provider_context';
import { AGENTS_INDEX } from '../../../../plugins/fleet/common';
export default function ({ getService }: FtrProviderContext) {
const es = getService('es');
const esArchiver = getService('esArchiver');
const supertest = getService('supertest');
describe('fleet_agents_status', () => {
before(async () => {
await esArchiver.loadIfNeeded('fleet/agents');
// 2 agents online
await es.update({
id: 'agent1',
refresh: 'wait_for',
index: AGENTS_INDEX,
body: {
doc: {
last_checkin: new Date().toISOString(),
},
},
});
await es.update({
id: 'agent2',
refresh: 'wait_for',
index: AGENTS_INDEX,
body: {
doc: {
last_checkin: new Date().toISOString(),
},
},
});
// 1 agents offline
await es.update({
id: 'agent3',
refresh: 'wait_for',
index: AGENTS_INDEX,
body: {
doc: {
last_checkin: new Date(Date.now() - 1000 * 60 * 60 * 60 * 10).toISOString(),
},
},
});
// 1 agent upgrading
await es.update({
id: 'agent4',
refresh: 'wait_for',
index: AGENTS_INDEX,
body: {
doc: {
last_checkin: new Date().toISOString(),
upgrade_started_at: new Date().toISOString(),
},
},
});
});
after(async () => {
await esArchiver.unload('fleet/agents');
});
it('should return the status of agents', async () => {
const { body: apiResponse } = await supertest.get(`/api/fleet/agent-status`).expect(200);
expect(apiResponse).to.eql({
results: {
events: 0,
total: 4,
online: 2,
error: 0,
offline: 1,
updating: 1,
other: 1,
},
});
});
});
}

View file

@ -25,6 +25,7 @@ export default function ({ loadTestFile }) {
loadTestFile(require.resolve('./agents/actions'));
loadTestFile(require.resolve('./agents/upgrade'));
loadTestFile(require.resolve('./agents/reassign'));
loadTestFile(require.resolve('./agents/status'));
// Enrollment API keys
loadTestFile(require.resolve('./enrollment_api_keys/crud'));