Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8e08982
initial cypress test file for policy response
paul-tavares Apr 4, 2023
e178a6f
Merge remote-tracking branch 'upstream/main' into task/olm-6033-polic…
paul-tavares Apr 5, 2023
9746670
new `EndpointPolicyResponseGenerator`
paul-tavares Apr 5, 2023
4f0a812
new indexer utility for policy responses
paul-tavares Apr 5, 2023
305dc1e
Endpoint Emulator ability to send policy responses
paul-tavares Apr 5, 2023
25a2084
additional setup for cypress test
paul-tavares Apr 5, 2023
f6ed879
update metadata as well after policy response is sent
paul-tavares Apr 6, 2023
2d95914
Adjusted policy generator so that a more realistic mock is created + …
paul-tavares Apr 6, 2023
54c50fd
Added method to Policy Response generator for creating a MacosSystemE…
paul-tavares Apr 6, 2023
805c275
ability to send `connect_kernel` failures (macOS system ext. failures)
paul-tavares Apr 6, 2023
b2f8fd4
show response type on cli panel
paul-tavares Apr 6, 2023
2b0fbb8
cli: add prompt to send policy response after configure
paul-tavares Apr 7, 2023
d029dca
cli: new layout tagged template literal that processes DataFormatter's
paul-tavares Apr 7, 2023
c3d3ee3
cli: show policy responder options horizontally
paul-tavares Apr 7, 2023
31f1f4f
Added `.custom()` static method to `EndpointMetadataGenerator` (allow…
paul-tavares Apr 7, 2023
83a0165
Updated OSFields type
paul-tavares Apr 7, 2023
be5e2b6
Added `.custom()` static method to `EndpointDocGenerator` (allows cus…
paul-tavares Apr 7, 2023
6619f50
cli: Updated endpoint emulator to create the custom EndpoingDocGnerat…
paul-tavares Apr 7, 2023
e3a442f
Merge remote-tracking branch 'upstream/main' into task/olm-6033-polic…
paul-tavares Apr 11, 2023
6774e25
remove `customIndexFn` prop from `CyLoadEndpointDataOptions`
paul-tavares Apr 11, 2023
19d55d8
Added additional options to Cy `indexEndpointHosts` data loader for s…
paul-tavares Apr 11, 2023
056ed95
Fix index fleet agents and associated generator to ensure agent ids m…
paul-tavares Apr 11, 2023
6c8e914
Policy Response data delete function
paul-tavares Apr 11, 2023
e5092b9
Fix index fleet agents and associated generator to ensure agent ids m…
paul-tavares Apr 11, 2023
4e6abd0
Fix index fleet agents and associated generator to ensure agent ids m…
paul-tavares Apr 11, 2023
aef3a10
Cy test to validate policy response errors on fleet agent details
paul-tavares Apr 11, 2023
0260fea
fix `EndpointPolicyGenerator.generateConnectedKernelFialure()`
paul-tavares Apr 11, 2023
06459ae
Cy test for policy response from Endpoint details panel
paul-tavares Apr 11, 2023
7d0f16f
Temporarily fix TS error in EndpointDocGenerator
paul-tavares Apr 11, 2023
6295bd2
Fix types + use `loadEndpointHost()` task method
paul-tavares Apr 11, 2023
dbc2859
Merge branch 'main' into task/olm-6033-policy-response-tests
paul-tavares Apr 12, 2023
82e57b5
Merge branch 'main' into task/olm-6033-policy-response-tests
paul-tavares Apr 12, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import styled from 'styled-components';

import type { EuiAccordionProps } from '@elastic/eui/src/components/accordion';

import type { Agent, AgentPolicy, PackagePolicy } from '../../../../../types';
import type { FleetServerAgentComponentUnit } from '../../../../../../../../common/types/models/agent';
import { useLink, useUIExtension } from '../../../../../hooks';
Expand Down Expand Up @@ -69,18 +71,29 @@ const StyledEuiLink = styled(EuiLink)`
font-size: ${(props) => props.theme.eui.euiFontSizeS};
`;

const CollapsablePanel: React.FC<{ id: string; title: React.ReactNode }> = ({
id,
title,
children,
}) => {
const CollapsablePanel: React.FC<{
id: string;
title: React.ReactNode;
'data-test-subj'?: string;
}> = ({ id, title, children, 'data-test-subj': dataTestSubj }) => {
const arrowProps = useMemo<EuiAccordionProps['arrowProps']>(() => {
if (dataTestSubj) {
return {
'data-test-subj': `${dataTestSubj}-openCloseToggle`,
};
}
return undefined;
}, [dataTestSubj]);

return (
<EuiPanel paddingSize="none">
<StyledEuiAccordion
id={id}
arrowDisplay="left"
buttonClassName="ingest-integration-title-button"
buttonContent={title}
arrowProps={arrowProps}
data-test-subj={dataTestSubj}
>
{children}
</StyledEuiAccordion>
Expand All @@ -92,7 +105,8 @@ export const AgentDetailsIntegration: React.FunctionComponent<{
agent: Agent;
agentPolicy: AgentPolicy;
packagePolicy: PackagePolicy;
}> = memo(({ agent, agentPolicy, packagePolicy }) => {
'data-test-subj'?: string;
}> = memo(({ agent, agentPolicy, packagePolicy, 'data-test-subj': dataTestSubj }) => {
const { getHref } = useLink();
const theme = useEuiTheme();

Expand Down Expand Up @@ -204,6 +218,7 @@ export const AgentDetailsIntegration: React.FunctionComponent<{
return (
<CollapsablePanel
id={packagePolicy.id}
data-test-subj={dataTestSubj}
title={
<EuiTitle size="xs">
<h3>
Expand Down Expand Up @@ -234,7 +249,12 @@ export const AgentDetailsIntegration: React.FunctionComponent<{
</EuiFlexItem>
{showNeedsAttentionBadge && (
<EuiFlexItem grow={false}>
<EuiBadge color={theme.euiTheme.colors.danger} iconType="warning" iconSide="left">
<EuiBadge
color={theme.euiTheme.colors.danger}
iconType="warning"
iconSide="left"
data-test-subj={dataTestSubj ? `${dataTestSubj}-needsAttention` : undefined}
>
<FormattedMessage
id="xpack.fleet.agentDetailsIntegrations.needsAttention.label"
defaultMessage="Needs attention"
Expand Down Expand Up @@ -270,13 +290,16 @@ export const AgentDetailsIntegrationsSection: React.FunctionComponent<{

return (
<EuiFlexGroup direction="column" gutterSize="m">
{(agentPolicy.package_policies as PackagePolicy[]).map((packagePolicy) => {
{(agentPolicy.package_policies as PackagePolicy[]).map((packagePolicy, index) => {
const testSubj = (packagePolicy.package?.name ?? 'packagePolicy') + '-' + index;

return (
<EuiFlexItem grow={false} key={packagePolicy.id}>
<EuiFlexItem grow={false} key={packagePolicy.id} data-test-subj={testSubj}>
<AgentDetailsIntegration
agent={agent}
agentPolicy={agentPolicy}
packagePolicy={packagePolicy}
data-test-subj={`${testSubj}-accordion`}
/>
</EuiFlexItem>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,102 @@
* 2.0.
*/

/* eslint-disable max-classes-per-file */

import type { DeepPartial } from 'utility-types';
import { merge } from 'lodash';
import { merge, set } from 'lodash';
import { gte } from 'semver';
import type { EndpointCapabilities } from '../service/response_actions/constants';
import { BaseDataGenerator } from './base_data_generator';
import type { HostMetadataInterface, OSFields } from '../types';
import { EndpointStatus, HostPolicyResponseActionStatus } from '../types';

export interface GetCustomEndpointMetadataGeneratorOptions {
/** Version for agent/endpoint. Defaults to the stack version */
version: string;
/** OS type for the generated endpoint hosts */
os: 'macOS' | 'windows' | 'linux';
}

/**
* Metadata generator for docs that are sent by the Endpoint running on hosts
*/
export class EndpointMetadataGenerator extends BaseDataGenerator {
/**
* Returns a Custom `EndpointMetadataGenerator` subclass that will generate specific
* documents based on input arguments
*/
static custom({
version,
os,
}: Partial<GetCustomEndpointMetadataGeneratorOptions> = {}): typeof EndpointMetadataGenerator {
return class extends EndpointMetadataGenerator {
generate(overrides: DeepPartial<HostMetadataInterface> = {}): HostMetadataInterface {
if (version) {
set(overrides, 'agent.version', version);
}

if (os) {
switch (os) {
case 'linux':
set(overrides, 'host.os', EndpointMetadataGenerator.linuxOSFields);
break;

case 'macOS':
set(overrides, 'host.os', EndpointMetadataGenerator.macOSFields);
break;

default:
set(overrides, 'host.os', EndpointMetadataGenerator.windowsOSFields);
}
}

return super.generate(overrides);
}
};
}

public static get windowsOSFields(): OSFields {
return {
name: 'Windows',
full: 'Windows 10',
version: '10.0',
platform: 'Windows',
family: 'windows',
Ext: {
variant: 'Windows Pro',
},
};
}

public static get linuxOSFields(): OSFields {
return {
Ext: {
variant: 'Debian',
},
kernel: '4.19.0-21-cloud-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30)',
name: 'Linux',
family: 'debian',
type: 'linux',
version: '10.12',
platform: 'debian',
full: 'Debian 10.12',
};
}

public static get macOSFields(): OSFields {
return {
name: 'macOS',
full: 'macOS Monterey',
version: '12.6.1',
platform: 'macOS',
family: 'Darwin',
Ext: {
variant: 'Darwin',
},
};
}

/** Generate an Endpoint host metadata document */
generate(overrides: DeepPartial<HostMetadataInterface> = {}): HostMetadataInterface {
const ts = overrides['@timestamp'] ?? new Date().getTime();
Expand Down Expand Up @@ -102,16 +186,7 @@ export class EndpointMetadataGenerator extends BaseDataGenerator {

protected randomOsFields(): OSFields {
return this.randomChoice([
{
name: 'Windows',
full: 'Windows 10',
version: '10.0',
platform: 'Windows',
family: 'windows',
Ext: {
variant: 'Windows Pro',
},
},
EndpointMetadataGenerator.windowsOSFields,
{
name: 'Windows',
full: 'Windows Server 2016',
Expand Down Expand Up @@ -142,18 +217,8 @@ export class EndpointMetadataGenerator extends BaseDataGenerator {
variant: 'Windows Server Release 2',
},
},
{
Ext: {
variant: 'Debian',
},
kernel: '4.19.0-21-cloud-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30)',
name: 'Linux',
family: 'debian',
type: 'linux',
version: '10.12',
platform: 'debian',
full: 'Debian 10.12',
},
EndpointMetadataGenerator.linuxOSFields,
EndpointMetadataGenerator.macOSFields,
]);
}
}
Loading