From c6537657d67c782b5e4e01eef8449fa4f51e0052 Mon Sep 17 00:00:00 2001 From: nnamdifrankie Date: Sat, 18 Apr 2020 08:50:27 -0400 Subject: [PATCH] EMT-146: add integration tests --- .../api_integration/apis/endpoint/index.ts | 1 + .../apis/endpoint/metadata_status.ts | 153 + .../endpoint_status_feature/data.json.gz | Bin 0 -> 34199 bytes .../endpoint_status_feature/mappings.json | 3255 +++++++++++++++++ 4 files changed, 3409 insertions(+) create mode 100644 x-pack/test/api_integration/apis/endpoint/metadata_status.ts create mode 100644 x-pack/test/functional/es_archives/endpoint/metadata/endpoint_status_feature/data.json.gz create mode 100644 x-pack/test/functional/es_archives/endpoint/metadata/endpoint_status_feature/mappings.json diff --git a/x-pack/test/api_integration/apis/endpoint/index.ts b/x-pack/test/api_integration/apis/endpoint/index.ts index 0a5f9aa595b8a3..1c373d85365f9d 100644 --- a/x-pack/test/api_integration/apis/endpoint/index.ts +++ b/x-pack/test/api_integration/apis/endpoint/index.ts @@ -19,6 +19,7 @@ export default function endpointAPIIntegrationTests({ loadTestFile(require.resolve('./index_pattern')); loadTestFile(require.resolve('./resolver')); loadTestFile(require.resolve('./metadata')); + loadTestFile(require.resolve('./metadata_status')); loadTestFile(require.resolve('./alerts')); }); } diff --git a/x-pack/test/api_integration/apis/endpoint/metadata_status.ts b/x-pack/test/api_integration/apis/endpoint/metadata_status.ts new file mode 100644 index 00000000000000..480ad4d18d3b06 --- /dev/null +++ b/x-pack/test/api_integration/apis/endpoint/metadata_status.ts @@ -0,0 +1,153 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import uuid from 'uuid'; +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { getSupertestWithoutAuth } from '../fleet/agents/services'; + +export default function(providerContext: FtrProviderContext) { + const { getService } = providerContext; + const esArchiver = getService('esArchiver'); + const supertest = getService('supertest'); + const supertestWithoutAuth = getSupertestWithoutAuth(providerContext); + const esClient = getService('es'); + // agent that is enrolled and know to fleet + const enrolledAgentId = '3efef370-8164-11ea-bc0d-9196b6de96eb'; + // host that is connected to enrolledAgentId + const enrolledHostId = 'fdb346d9-6f56-426a-90a7-a9328d1b0528'; + // host that is not connected to an enrolled agent id + const notEnrolledHostId = 'bcf0d070-d9f2-40aa-8620-cbc004747722'; + + let apiKey: { id: string; api_key: string }; + + describe('test metadata api status', () => { + describe('/api/endpoint/metadata when index is not empty', () => { + before(async () => { + await esArchiver.load('endpoint/metadata/endpoint_status_feature'); + const { body: apiKeyBody } = await esClient.security.createApiKey({ + body: { + name: `test access api key: ${uuid.v4()}`, + }, + }); + apiKey = apiKeyBody; + const { + body: { _source: agentDoc }, + } = await esClient.get({ + index: '.kibana', + id: `agents:${enrolledAgentId}`, + }); + + agentDoc.agents.access_api_key_id = apiKey.id; + + await esClient.update({ + index: '.kibana', + id: `agents:${enrolledAgentId}`, + refresh: 'true', + body: { + doc: agentDoc, + }, + }); + }); + + after(async () => await esArchiver.unload('endpoint/metadata/endpoint_status_feature')); + it('should return single metadata with status error when agent status is error', async () => { + const { body: metadataResponse } = await supertest + .get(`/api/endpoint/metadata/${enrolledHostId}`) + .set('kbn-xsrf', 'xxx') + .expect(200); + expect(metadataResponse.host_status).to.be('error'); + }); + + it('should return single metadata with status error when agent is not enrolled', async () => { + const { body: metadataResponse } = await supertest + .get(`/api/endpoint/metadata/${notEnrolledHostId}`) + .set('kbn-xsrf', 'xxx') + .expect(200); + expect(metadataResponse.host_status).to.be('error'); + }); + + it('should return metadata list with status error when no agent is not enrolled', async () => { + const { body } = await supertest + .post('/api/endpoint/metadata') + .set('kbn-xsrf', 'xxx') + .expect(200); + expect(body.total).to.eql(2); + expect(body.hosts.length).to.eql(2); + const enrolledHost = body.hosts.filter( + (hostInfo: Record) => hostInfo.metadata.host.id === enrolledHostId + ); + const notEnrolledHost = body.hosts.filter( + (hostInfo: Record) => hostInfo.metadata.host.id === notEnrolledHostId + ); + expect(enrolledHost.host_status === 'error'); + expect(notEnrolledHost.host_status === 'error'); + }); + + it('should return metadata list with status only when agent is checked in', async () => { + const { body: checkInResponse } = await supertestWithoutAuth + .post(`/api/ingest_manager/fleet/agents/${enrolledAgentId}/checkin`) + .set('kbn-xsrf', 'xx') + .set( + 'Authorization', + `ApiKey ${Buffer.from(`${apiKey.id}:${apiKey.api_key}`).toString('base64')}` + ) + .send({ + events: [], + local_metadata: {}, + }) + .expect(200); + + expect(checkInResponse.action).to.be('checkin'); + expect(checkInResponse.success).to.be(true); + + const { body } = await supertest + .post('/api/endpoint/metadata') + .set('kbn-xsrf', 'xxx') + .expect(200); + expect(body.total).to.eql(2); + expect(body.hosts.length).to.eql(2); + const enrolledHost = body.hosts.filter( + (hostInfo: Record) => hostInfo.metadata.host.id === enrolledHostId + ); + const notEnrolledHost = body.hosts.filter( + (hostInfo: Record) => hostInfo.metadata.host.id === notEnrolledHostId + ); + expect(enrolledHost.host_status === 'online'); + expect(notEnrolledHost.host_status === 'error'); + }); + + it('should return single metadata with status online when agent status is online', async () => { + await inactivity(); + const { body: checkInResponse } = await supertestWithoutAuth + .post(`/api/ingest_manager/fleet/agents/${enrolledAgentId}/checkin`) + .set('kbn-xsrf', 'xx') + .set( + 'Authorization', + `ApiKey ${Buffer.from(`${apiKey.id}:${apiKey.api_key}`).toString('base64')}` + ) + .send({ + events: [], + local_metadata: {}, + }) + .expect(200); + + expect(checkInResponse.action).to.be('checkin'); + expect(checkInResponse.success).to.be(true); + + const { body: metadataResponse } = await supertest + .get(`/api/endpoint/metadata/${enrolledHostId}`) + .set('kbn-xsrf', 'xxx') + .expect(200); + expect(metadataResponse.host_status).to.be('online'); + }); + }); + }); +} + +function inactivity() { + return new Promise(resolve => setTimeout(resolve, 35000)); +} diff --git a/x-pack/test/functional/es_archives/endpoint/metadata/endpoint_status_feature/data.json.gz b/x-pack/test/functional/es_archives/endpoint/metadata/endpoint_status_feature/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..7042db66daab73f2aa54786a165db8c8d3606bcc GIT binary patch literal 34199 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