Skip to content

Commit

Permalink
Address code review comments; add retry logic to incoming data component
Browse files Browse the repository at this point in the history
  • Loading branch information
criamico committed Apr 7, 2022
1 parent af9f8e8 commit db8c8ac
Show file tree
Hide file tree
Showing 11 changed files with 74 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,6 @@ jest.mock('./steps', () => {
'data-test-subj': 'agent-enrollment-key-selection-step',
title: 'agent-enrollment-key-selection-step',
}),
ViewDataStep: jest.fn().mockReturnValue({
'data-test-subj': 'view-data-step',
title: 'view-data-step',
}),
DownloadStep: jest
.fn()
.mockReturnValue({ 'data-test-subj': 'download-step', title: 'download-step' }),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,52 +189,13 @@ describe('<AgentEnrollmentFlyout />', () => {
expect(exists('agent-enrollment-key-selection-step')).toBe(true);
});
});

// Skipped due to implementation details in the step components. See https:/elastic/kibana/issues/103894
describe.skip('"View data" extension point', () => {
it('shows the "View data" step when UI extension is provided', async () => {
jest.clearAllMocks();
await act(async () => {
testBed = await setup({
onClose: jest.fn(),
});
testBed.component.update();
});
const { exists, actions } = testBed;
expect(exists('agentEnrollmentFlyout')).toBe(true);
expect(exists('view-data-step')).toBe(true);

jest.clearAllMocks();
actions.goToStandaloneTab();
expect(exists('agentEnrollmentFlyout')).toBe(true);
expect(exists('view-data-step')).toBe(false);
});

it('does not call the "View data" step when UI extension is not provided', async () => {
jest.clearAllMocks();
await act(async () => {
testBed = await setup({
onClose: jest.fn(),
});
testBed.component.update();
});
const { exists, actions } = testBed;
expect(exists('agentEnrollmentFlyout')).toBe(true);
expect(exists('view-data-step')).toBe(false);

jest.clearAllMocks();
actions.goToStandaloneTab();
expect(exists('view-data-step')).toBe(false);
});
});
});

// Skipped due to UI changing in https:/elastic/kibana/issues/125534. These tests should be rethought overall
// to provide value around the new flyout structure
describe.skip('standalone instructions', () => {
it('uses the agent policy selection step', async () => {
const { exists, actions } = testBed;

actions.goToStandaloneTab();

expect(exists('agentEnrollmentFlyout')).toBe(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const POLLING_INTERVAL_MS = 5 * 1000; // 5 sec
* Hook for finding agents enrolled since component was rendered. Should be
* used by parent component to power rendering
* @param policyId
* @returns
* @returns agentIds
*/
export const usePollingAgentCount = (policyId: string) => {
const [agentIds, setAgentIds] = useState<string[]>([]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,29 @@ import React from 'react';
import { EuiCallOut, EuiText, EuiSpacer, EuiButton } from '@elastic/eui';
import { i18n } from '@kbn/i18n';

import type { InstalledIntegrationPolicy } from '../../hooks';
import { useGetAgentIncomingData } from '../../hooks';
import type { InstalledIntegrationPolicy } from './use_get_agent_incoming_data';
import { useGetAgentIncomingData, usePollingIncomingData } from './use_get_agent_incoming_data';

interface Props {
agentsIds: string[];
agentIds: string[];
installedPolicy?: InstalledIntegrationPolicy;
agentDataConfirmed: boolean;
setAgentDataConfirmed: (v: boolean) => void;
}

export const ConfirmIncomingData: React.FunctionComponent<Props> = ({
agentsIds,
agentIds,
installedPolicy,
agentDataConfirmed,
setAgentDataConfirmed,
}) => {
const { enrolledAgents, numAgentsWithData, isLoading, linkButton, message } =
useGetAgentIncomingData(agentsIds, installedPolicy);
const { incomingData, isLoading } = usePollingIncomingData(agentIds);

const { enrolledAgents, numAgentsWithData, linkButton, message } = useGetAgentIncomingData(
incomingData,
installedPolicy
);

if (!isLoading && enrolledAgents > 0 && numAgentsWithData > 0) {
setAgentDataConfirmed(true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ export const ManagedSteps: React.FunctionComponent<InstructionProps> = ({
if (selectedPolicy && enrolledAgentIds.length) {
steps.push(
IncomingDataConfirmationStep({
agentsIds: enrolledAgentIds,
agentIds: enrolledAgentIds,
agentDataConfirmed,
setAgentDataConfirmed,
installedPolicy: installedPackagePolicy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ import { i18n } from '@kbn/i18n';

import type { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps';

import type { InstalledIntegrationPolicy } from '../../../hooks';
import type { InstalledIntegrationPolicy } from '../use_get_agent_incoming_data';

import { ConfirmIncomingData } from '../confirm_incoming_data';

export const IncomingDataConfirmationStep = ({
agentsIds,
agentIds,
installedPolicy,
agentDataConfirmed,
setAgentDataConfirmed,
}: {
agentsIds: string[];
agentIds: string[];
installedPolicy?: InstalledIntegrationPolicy;
agentDataConfirmed: boolean;
setAgentDataConfirmed: (v: boolean) => void;
Expand All @@ -36,7 +36,7 @@ export const IncomingDataConfirmationStep = ({
}),
children: (
<ConfirmIncomingData
agentsIds={agentsIds}
agentIds={agentIds}
installedPolicy={installedPolicy}
agentDataConfirmed={agentDataConfirmed}
setAgentDataConfirmed={setAgentDataConfirmed}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
*/

import type { AgentPolicy, Settings } from '../../types';
import type { InstalledIntegrationPolicy } from '../../hooks/use_get_agent_incoming_data';

import type { InstalledIntegrationPolicy } from './use_get_agent_incoming_data';

export type K8sMode = 'IS_LOADING' | 'IS_KUBERNETES' | 'IS_NOT_KUBERNETES';
export type FlyoutMode = 'managed' | 'standalone';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,22 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { useEffect, useState, useMemo } from 'react';
import { useEffect, useState, useMemo, useRef } from 'react';
import { i18n } from '@kbn/i18n';

import type { IncomingDataList } from '../../common/types/rest_spec/agent';
import type { IncomingDataList } from '../../../common/types/rest_spec/agent';

import { sendGetAgentIncomingData, useLink } from './index';
import { sendGetAgentIncomingData, useLink } from '../../hooks/index';

export interface InstalledIntegrationPolicy {
name: string;
version: string;
}

export const useGetAgentIncomingData = (
agentsIds: string[],
incomingData: IncomingDataList[],
installedPolicy?: InstalledIntegrationPolicy
) => {
const [isLoading, setIsLoading] = useState<boolean>(true);
const [incomingData, setIncomingData] = useState<IncomingDataList[]>([]);

useEffect(() => {
const getIncomingData = async () => {
const { data } = await sendGetAgentIncomingData({ agentsIds });
if (data?.items) {
setIncomingData(data?.items);
setIsLoading(false);
}
};
if (agentsIds) {
getIncomingData();
}
}, [agentsIds]);

const enrolledAgents = useMemo(() => incomingData.length, [incomingData.length]);
const numAgentsWithData = useMemo(
() =>
Expand Down Expand Up @@ -83,8 +67,47 @@ export const useGetAgentIncomingData = (
return {
enrolledAgents,
numAgentsWithData,
isLoading,
linkButton,
message,
};
};

/**
* Hook for polling incoming data for the selected agent policy.
* @param agentIds
* @returns incomingData, isLoading
*/
const POLLING_INTERVAL_MS = 5 * 1000; // 5 sec

export const usePollingIncomingData = (agentsIds: string[]) => {
const timeout = useRef<number | undefined>(undefined);
const [incomingData, setIncomingData] = useState<IncomingDataList[]>([]);
const [isLoading, setIsLoading] = useState<boolean>(true);

useEffect(() => {
let isAborted = false;

const poll = () => {
timeout.current = window.setTimeout(async () => {
const { data } = await sendGetAgentIncomingData({ agentsIds });

if (data?.items) {
setIncomingData(data?.items);
setIsLoading(false);
}
if (!isAborted) {
poll();
}
}, POLLING_INTERVAL_MS);
};

poll();
if (isAborted || incomingData.length > 0) clearTimeout(timeout.current);

return () => {
isAborted = true;
};
}, [agentsIds, incomingData]);

return { incomingData, isLoading };
};
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,19 @@ export const StandaloneInstructions = (
const KUBERNETES_RUN_INSTRUCTIONS = 'kubectl apply -f elastic-agent-standalone-kubernetes.yaml';

const STANDALONE_RUN_INSTRUCTIONS_LINUX = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz
tar xzvf elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz
sudo ./elastic-agent install`;
tar xzvf elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz
cd elastic-agent-${kibanaVersion}-linux-x86_64
sudo ./elastic-agent install`;

const STANDALONE_RUN_INSTRUCTIONS_MAC = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz
tar xzvf elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz
sudo ./elastic-agent install`;
tar xzvf elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz
cd elastic-agent-${kibanaVersion}-darwin-x86_64
sudo ./elastic-agent install`;

const STANDALONE_RUN_INSTRUCTIONS_WINDOWS = `wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-windows-x86_64.zip -OutFile elastic-agent-${kibanaVersion}-windows-x86_64.zip
Expand-Archive .\elastic-agent-${kibanaVersion}-windows-x86_64.zip
.\\elastic-agent.exe install`;
Expand-Archive .\elastic-agent-${kibanaVersion}-windows-x86_64.zip
cd elastic-agent-${kibanaVersion}-windows-x86_64
.\\elastic-agent.exe install`;

const linuxDebCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-amd64.deb
sudo dpkg -i elastic-agent-${kibanaVersion}-amd64.deb \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`;
Expand Down
1 change: 0 additions & 1 deletion x-pack/plugins/fleet/public/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,3 @@ export * from './use_platform';
export * from './use_agent_policy_refresh';
export * from './use_package_installations';
export * from './use_agent_enrollment_flyout_data';
export * from './use_get_agent_incoming_data';
2 changes: 1 addition & 1 deletion x-pack/plugins/fleet/server/services/agents/status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ export async function getIncomingDataByAgentsId(
agent_ids: {
terms: {
field: 'agent.id',
size: 10,
size: agentsIds.length,
},
},
},
Expand Down

0 comments on commit db8c8ac

Please sign in to comment.