mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
[Fleet] Honor registry datastream source_mode in package policy editor UI (#147034)
This commit is contained in:
parent
6d5b292638
commit
f8fea0fb93
16 changed files with 380 additions and 188 deletions
|
@ -15,7 +15,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"cost_explorer_config.group_by_dimension_keys": Object {
|
||||
"type": "text",
|
||||
|
@ -54,7 +53,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"api_timeout": Object {
|
||||
"type": "text",
|
||||
|
@ -87,7 +85,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": false,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"interval": Object {
|
||||
"type": "text",
|
||||
|
@ -134,7 +131,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"api_timeout": Object {
|
||||
"type": "text",
|
||||
|
@ -167,7 +163,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -214,7 +209,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -249,7 +243,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -284,7 +277,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"api_timeout": Object {
|
||||
"type": "text",
|
||||
|
@ -317,7 +309,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -352,7 +343,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"api_timeout": Object {
|
||||
"type": "text",
|
||||
|
@ -385,7 +375,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -420,7 +409,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -455,7 +443,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -484,7 +471,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -519,7 +505,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"api_timeout": Object {
|
||||
"type": "text",
|
||||
|
@ -552,7 +537,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -574,7 +558,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -603,7 +586,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -638,7 +620,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -667,7 +648,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -696,7 +676,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
@ -725,7 +704,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"api_timeout": Object {
|
||||
"type": "text",
|
||||
|
@ -758,7 +736,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "beta",
|
||||
"vars": Object {
|
||||
"latency": Object {
|
||||
"type": "text",
|
||||
|
|
|
@ -15,7 +15,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "ga",
|
||||
"vars": Object {
|
||||
"ignore_older": Object {
|
||||
"type": "text",
|
||||
|
@ -49,7 +48,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "ga",
|
||||
"vars": Object {
|
||||
"ignore_older": Object {
|
||||
"type": "text",
|
||||
|
@ -91,7 +89,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": false,
|
||||
"release": "ga",
|
||||
"vars": Object {
|
||||
"interval": Object {
|
||||
"type": "text",
|
||||
|
@ -124,7 +121,6 @@ Object {
|
|||
"type": "logs",
|
||||
},
|
||||
"enabled": false,
|
||||
"release": "ga",
|
||||
"vars": Object {
|
||||
"interval": Object {
|
||||
"type": "text",
|
||||
|
@ -207,7 +203,6 @@ Object {
|
|||
"type": "metrics",
|
||||
},
|
||||
"enabled": true,
|
||||
"release": "ga",
|
||||
"vars": Object {
|
||||
"period": Object {
|
||||
"type": "text",
|
||||
|
|
|
@ -11,6 +11,7 @@ export {
|
|||
packageToPackagePolicyInputs,
|
||||
packageToPackagePolicy,
|
||||
getStreamsForInputType,
|
||||
getRegistryStreamWithDataStreamForInputType,
|
||||
} from './package_to_package_policy';
|
||||
export { fullAgentPolicyToYaml } from './full_agent_policy_to_yaml';
|
||||
export { isPackageLimited, doesAgentPolicyAlreadyIncludePackage } from './limited_package';
|
||||
|
|
|
@ -15,6 +15,7 @@ import type {
|
|||
NewPackagePolicyInputStream,
|
||||
NewPackagePolicy,
|
||||
PackagePolicyConfigRecordEntry,
|
||||
RegistryStreamWithDataStream,
|
||||
} from '../types';
|
||||
|
||||
import { doesPackageHaveIntegrations } from '.';
|
||||
|
@ -24,7 +25,7 @@ import {
|
|||
isIntegrationPolicyTemplate,
|
||||
} from './policy_template';
|
||||
|
||||
type PackagePolicyStream = RegistryStream & { release?: 'beta' | 'experimental' | 'ga' } & {
|
||||
type PackagePolicyStream = RegistryStream & {
|
||||
data_stream: { type: string; dataset: string };
|
||||
};
|
||||
|
||||
|
@ -48,7 +49,33 @@ export const getStreamsForInputType = (
|
|||
type: dataStream.type,
|
||||
dataset: dataStream.dataset,
|
||||
},
|
||||
release: dataStream.release,
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return streams;
|
||||
};
|
||||
|
||||
export const getRegistryStreamWithDataStreamForInputType = (
|
||||
inputType: string,
|
||||
packageInfo: PackageInfo,
|
||||
dataStreamPaths: string[] = []
|
||||
): RegistryStreamWithDataStream[] => {
|
||||
const streams: RegistryStreamWithDataStream[] = [];
|
||||
const dataStreams = getNormalizedDataStreams(packageInfo);
|
||||
const dataStreamsToSearch = dataStreamPaths.length
|
||||
? dataStreams.filter((dataStream) => dataStreamPaths.includes(dataStream.path))
|
||||
: dataStreams;
|
||||
|
||||
dataStreamsToSearch.forEach((dataStream) => {
|
||||
(dataStream.streams || []).forEach((stream) => {
|
||||
if (stream.input === inputType) {
|
||||
streams.push({
|
||||
...stream,
|
||||
data_stream: {
|
||||
...dataStream,
|
||||
},
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -113,7 +140,6 @@ export const packageToPackagePolicyInputs = (
|
|||
const stream: NewPackagePolicyInputStream = {
|
||||
enabled: packageStream.enabled === false ? false : true,
|
||||
data_stream: packageStream.data_stream,
|
||||
release: packageStream.release,
|
||||
};
|
||||
if (packageStream.vars && packageStream.vars.length) {
|
||||
stream.vars = packageStream.vars.reduce(varsReducer, {});
|
||||
|
|
|
@ -244,6 +244,8 @@ export interface RegistryStream {
|
|||
[RegistryStreamKeys.template_path]: string;
|
||||
}
|
||||
|
||||
export type RegistryStreamWithDataStream = RegistryStream & { data_stream: RegistryDataStream };
|
||||
|
||||
export type RequirementVersion = string;
|
||||
export type RequirementVersionRange = string;
|
||||
export interface ServiceRequirements {
|
||||
|
|
|
@ -34,6 +34,7 @@ export interface NewPackagePolicyInputStream {
|
|||
indices?: string[];
|
||||
};
|
||||
index_mode?: string;
|
||||
source_mode?: string;
|
||||
};
|
||||
};
|
||||
release?: RegistryRelease;
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* 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 React from 'react';
|
||||
|
||||
import { createFleetTestRendererMock } from '../../../../../../../../mock';
|
||||
|
||||
import type { RegistryDataStream } from '../../../../../../../../../common/types';
|
||||
|
||||
import { ExperimentDatastreamSettings } from './experimental_datastream_settings';
|
||||
|
||||
jest.mock('../../../../../../../../hooks', () => {
|
||||
return {
|
||||
...jest.requireActual('../../../../../../../../hooks'),
|
||||
FleetStatusProvider: (props: any) => {
|
||||
return props.children;
|
||||
},
|
||||
useFleetStatus: jest.fn().mockReturnValue({ isReady: true } as any),
|
||||
sendGetStatus: jest
|
||||
.fn()
|
||||
.mockResolvedValue({ data: { isReady: true, missing_requirements: [] } }),
|
||||
};
|
||||
});
|
||||
|
||||
describe('ExperimentDatastreamSettings', () => {
|
||||
describe('Synthetic source', () => {
|
||||
it('should be enabled an not checked by default', () => {
|
||||
const mockSetNewExperimentalDataFeatures = jest.fn();
|
||||
const res = createFleetTestRendererMock().render(
|
||||
<ExperimentDatastreamSettings
|
||||
registryDataStream={{ type: 'logs', dataset: 'test' } as unknown as RegistryDataStream}
|
||||
experimentalDataFeatures={[]}
|
||||
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
|
||||
/>
|
||||
);
|
||||
|
||||
const syntheticSourceSwitch = res.getByTestId(
|
||||
'packagePolicyEditor.syntheticSourceExperimentalFeature.switch'
|
||||
);
|
||||
expect(syntheticSourceSwitch).not.toBeChecked();
|
||||
expect(syntheticSourceSwitch).toBeEnabled();
|
||||
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
|
||||
});
|
||||
|
||||
it('should be checked if the regitry datastream define source_mode synthetic', () => {
|
||||
const mockSetNewExperimentalDataFeatures = jest.fn();
|
||||
const res = createFleetTestRendererMock().render(
|
||||
<ExperimentDatastreamSettings
|
||||
registryDataStream={
|
||||
{
|
||||
type: 'logs',
|
||||
dataset: 'test',
|
||||
elasticsearch: {
|
||||
source_mode: 'synthetic',
|
||||
},
|
||||
} as unknown as RegistryDataStream
|
||||
}
|
||||
experimentalDataFeatures={[]}
|
||||
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
|
||||
/>
|
||||
);
|
||||
|
||||
const syntheticSourceSwitch = res.getByTestId(
|
||||
'packagePolicyEditor.syntheticSourceExperimentalFeature.switch'
|
||||
);
|
||||
expect(syntheticSourceSwitch).toBeChecked();
|
||||
expect(syntheticSourceSwitch).toBeEnabled();
|
||||
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
|
||||
});
|
||||
|
||||
it('should be not checked and disabled if the regitry datastream define source_mode synthetic and the user disabled it', () => {
|
||||
const mockSetNewExperimentalDataFeatures = jest.fn();
|
||||
const res = createFleetTestRendererMock().render(
|
||||
<ExperimentDatastreamSettings
|
||||
registryDataStream={
|
||||
{
|
||||
type: 'logs',
|
||||
dataset: 'test',
|
||||
elasticsearch: {
|
||||
source_mode: 'synthetic',
|
||||
},
|
||||
} as unknown as RegistryDataStream
|
||||
}
|
||||
experimentalDataFeatures={[
|
||||
{
|
||||
data_stream: 'logs-test',
|
||||
features: {
|
||||
synthetic_source: false,
|
||||
tsdb: false,
|
||||
},
|
||||
},
|
||||
]}
|
||||
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
|
||||
/>
|
||||
);
|
||||
|
||||
const syntheticSourceSwitch = res.getByTestId(
|
||||
'packagePolicyEditor.syntheticSourceExperimentalFeature.switch'
|
||||
);
|
||||
expect(syntheticSourceSwitch).not.toBeChecked();
|
||||
expect(syntheticSourceSwitch).toBeEnabled();
|
||||
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
|
||||
});
|
||||
|
||||
it('should not be checked and not enabled if the regitry datastream define source_mode default', () => {
|
||||
const mockSetNewExperimentalDataFeatures = jest.fn();
|
||||
const res = createFleetTestRendererMock().render(
|
||||
<ExperimentDatastreamSettings
|
||||
registryDataStream={
|
||||
{
|
||||
type: 'logs',
|
||||
dataset: 'test',
|
||||
elasticsearch: {
|
||||
source_mode: 'default',
|
||||
},
|
||||
} as unknown as RegistryDataStream
|
||||
}
|
||||
experimentalDataFeatures={[]}
|
||||
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
|
||||
/>
|
||||
);
|
||||
|
||||
const syntheticSourceSwitch = res.getByTestId(
|
||||
'packagePolicyEditor.syntheticSourceExperimentalFeature.switch'
|
||||
);
|
||||
expect(syntheticSourceSwitch).not.toBeChecked();
|
||||
expect(syntheticSourceSwitch).not.toBeEnabled();
|
||||
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,179 @@
|
|||
/*
|
||||
* 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 React from 'react';
|
||||
|
||||
import { FormattedMessage } from '@kbn/i18n-react';
|
||||
import {
|
||||
EuiFlexGroup,
|
||||
EuiFlexItem,
|
||||
EuiSwitch,
|
||||
EuiText,
|
||||
EuiSpacer,
|
||||
EuiTitle,
|
||||
EuiToolTip,
|
||||
} from '@elastic/eui';
|
||||
|
||||
import type {
|
||||
ExperimentalDataStreamFeature,
|
||||
RegistryDataStream,
|
||||
} from '../../../../../../../../../common/types';
|
||||
import { getRegistryDataStreamAssetBaseName } from '../../../../../../../../../common/services';
|
||||
import type { ExperimentalIndexingFeature } from '../../../../../../../../../common/types/models/epm';
|
||||
|
||||
interface Props {
|
||||
registryDataStream: RegistryDataStream;
|
||||
experimentalDataFeatures?: ExperimentalDataStreamFeature[];
|
||||
setNewExperimentalDataFeatures: (
|
||||
experimentalDataFeatures: ExperimentalDataStreamFeature[]
|
||||
) => void;
|
||||
}
|
||||
|
||||
function getExperimentalFeatureValue(
|
||||
feature: ExperimentalIndexingFeature,
|
||||
experimentalDataFeatures: ExperimentalDataStreamFeature[],
|
||||
registryDataStream: RegistryDataStream
|
||||
) {
|
||||
return experimentalDataFeatures?.find(
|
||||
({ data_stream: dataStream, features }) =>
|
||||
dataStream === getRegistryDataStreamAssetBaseName(registryDataStream) &&
|
||||
typeof features[feature] !== 'undefined'
|
||||
)?.features?.[feature];
|
||||
}
|
||||
|
||||
export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
|
||||
registryDataStream,
|
||||
experimentalDataFeatures,
|
||||
setNewExperimentalDataFeatures,
|
||||
}) => {
|
||||
const isSyntheticSourceEditable = registryDataStream.elasticsearch?.source_mode !== 'default';
|
||||
|
||||
const syntheticSourceExperimentalValue = getExperimentalFeatureValue(
|
||||
'synthetic_source',
|
||||
experimentalDataFeatures ?? [],
|
||||
registryDataStream
|
||||
);
|
||||
const isSyntheticSourceEnabledByDefault =
|
||||
registryDataStream.elasticsearch?.source_mode === 'synthetic';
|
||||
|
||||
const newExperimentalIndexingFeature = {
|
||||
synthetic_source:
|
||||
typeof syntheticSourceExperimentalValue !== 'undefined'
|
||||
? syntheticSourceExperimentalValue
|
||||
: isSyntheticSourceEnabledByDefault,
|
||||
tsdb:
|
||||
getExperimentalFeatureValue('tsdb', experimentalDataFeatures ?? [], registryDataStream) ??
|
||||
false,
|
||||
};
|
||||
|
||||
const onIndexingSettingChange = (
|
||||
features: Partial<Record<ExperimentalIndexingFeature, boolean>>
|
||||
) => {
|
||||
const newExperimentalDataStreamFeatures = [...(experimentalDataFeatures ?? [])];
|
||||
|
||||
const dataStream = getRegistryDataStreamAssetBaseName(registryDataStream);
|
||||
|
||||
const existingSettingRecord = newExperimentalDataStreamFeatures.find(
|
||||
(x) => x.data_stream === dataStream
|
||||
);
|
||||
|
||||
if (existingSettingRecord) {
|
||||
existingSettingRecord.features = {
|
||||
...existingSettingRecord.features,
|
||||
...features,
|
||||
};
|
||||
} else {
|
||||
newExperimentalDataStreamFeatures.push({
|
||||
data_stream: dataStream,
|
||||
features: { ...newExperimentalIndexingFeature, ...features },
|
||||
});
|
||||
}
|
||||
|
||||
setNewExperimentalDataFeatures(newExperimentalDataStreamFeatures);
|
||||
};
|
||||
|
||||
return (
|
||||
<EuiFlexItem>
|
||||
<EuiFlexGroup direction="column" gutterSize="xs">
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiTitle size="xxxs">
|
||||
<h5>
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.experimentalSettings.title"
|
||||
defaultMessage="Indexing settings (experimental)"
|
||||
/>
|
||||
</h5>
|
||||
</EuiTitle>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem>
|
||||
<EuiText color="subdued" size="xs">
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesDescription"
|
||||
defaultMessage="Select data streams to configure indexing options. This is an {experimentalFeature} and may have effects on other properties."
|
||||
values={{
|
||||
experimentalFeature: (
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.experimentalFeatureText"
|
||||
defaultMessage="experimental feature"
|
||||
/>
|
||||
</strong>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
<EuiSpacer size="s" />
|
||||
<EuiFlexItem>
|
||||
<EuiSwitch
|
||||
checked={newExperimentalIndexingFeature.synthetic_source ?? false}
|
||||
disabled={!isSyntheticSourceEditable}
|
||||
data-test-subj="packagePolicyEditor.syntheticSourceExperimentalFeature.switch"
|
||||
label={
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.syntheticSourceLabel"
|
||||
defaultMessage="Synthetic source"
|
||||
/>
|
||||
}
|
||||
onChange={(e) => {
|
||||
onIndexingSettingChange({
|
||||
synthetic_source: e.target.checked,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem>
|
||||
<EuiToolTip
|
||||
content={
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBTooltip"
|
||||
defaultMessage="Enabling this feature is irreversible"
|
||||
/>
|
||||
}
|
||||
>
|
||||
<EuiSwitch
|
||||
disabled={newExperimentalIndexingFeature.tsdb ?? false}
|
||||
checked={newExperimentalIndexingFeature.tsdb ?? false}
|
||||
data-test-subj="packagePolicyEditor.tsdbExperimentalFeature.switch"
|
||||
label={
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBLabel"
|
||||
defaultMessage="Time-series indexing (TSDB)"
|
||||
/>
|
||||
}
|
||||
onChange={(e) => {
|
||||
onIndexingSettingChange({
|
||||
tsdb: e.target.checked,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</EuiToolTip>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
</EuiFlexItem>
|
||||
);
|
||||
};
|
|
@ -27,6 +27,7 @@ import type {
|
|||
PackagePolicyInputStream,
|
||||
RegistryInput,
|
||||
RegistryStream,
|
||||
RegistryStreamWithDataStream,
|
||||
} from '../../../../../../types';
|
||||
import type { PackagePolicyInputValidationResults } from '../../../services';
|
||||
import { hasInvalidButRequiredVar, countValidationErrors } from '../../../services';
|
||||
|
@ -74,7 +75,7 @@ export const PackagePolicyInputPanel: React.FunctionComponent<{
|
|||
packageInput: RegistryInput;
|
||||
packageInfo: PackageInfo;
|
||||
packagePolicy: NewPackagePolicy;
|
||||
packageInputStreams: Array<RegistryStream & { data_stream: { dataset: string; type: string } }>;
|
||||
packageInputStreams: RegistryStreamWithDataStream[];
|
||||
packagePolicyInput: NewPackagePolicyInput;
|
||||
updatePackagePolicy: (updatedPackagePolicy: Partial<NewPackagePolicy>) => void;
|
||||
updatePackagePolicyInput: (updatedInput: Partial<NewPackagePolicyInput>) => void;
|
||||
|
|
|
@ -18,22 +18,19 @@ import {
|
|||
EuiText,
|
||||
EuiSpacer,
|
||||
EuiButtonEmpty,
|
||||
EuiTitle,
|
||||
EuiToolTip,
|
||||
} from '@elastic/eui';
|
||||
import { useRouteMatch } from 'react-router-dom';
|
||||
|
||||
import { useGetDataStreams } from '../../../../../../../../hooks';
|
||||
|
||||
import { mapPackageReleaseToIntegrationCardRelease } from '../../../../../../../../services/package_prerelease';
|
||||
import type { ExperimentalDataStreamFeature } from '../../../../../../../../../common/types/models/epm';
|
||||
|
||||
import { getRegistryDataStreamAssetBaseName } from '../../../../../../../../../common/services';
|
||||
import type { ExperimentalIndexingFeature } from '../../../../../../../../../common/types/models/epm';
|
||||
import type {
|
||||
NewPackagePolicy,
|
||||
NewPackagePolicyInputStream,
|
||||
PackageInfo,
|
||||
RegistryStream,
|
||||
RegistryStreamWithDataStream,
|
||||
RegistryVarsEntry,
|
||||
} from '../../../../../../types';
|
||||
import { InlineReleaseBadge } from '../../../../../../components';
|
||||
|
@ -42,6 +39,7 @@ import { isAdvancedVar, validationHasErrors } from '../../../services';
|
|||
import { PackagePolicyEditorDatastreamPipelines } from '../../datastream_pipelines';
|
||||
import { PackagePolicyEditorDatastreamMappings } from '../../datastream_mappings';
|
||||
|
||||
import { ExperimentDatastreamSettings } from './experimental_datastream_settings';
|
||||
import { PackagePolicyInputVarField } from './package_policy_input_var_field';
|
||||
import { useDataStreamId } from './hooks';
|
||||
import { orderDatasets } from './order_datasets';
|
||||
|
@ -53,7 +51,7 @@ const ScrollAnchor = styled.div`
|
|||
|
||||
interface Props {
|
||||
packagePolicy: NewPackagePolicy;
|
||||
packageInputStream: RegistryStream & { data_stream: { dataset: string; type: string } };
|
||||
packageInputStream: RegistryStreamWithDataStream;
|
||||
packageInfo: PackageInfo;
|
||||
packagePolicyInputStream: NewPackagePolicyInputStream;
|
||||
updatePackagePolicy: (updatedPackagePolicy: Partial<NewPackagePolicy>) => void;
|
||||
|
@ -123,61 +121,21 @@ export const PackagePolicyInputStreamConfig = memo<Props>(
|
|||
[advancedVars, inputStreamValidationResults?.vars]
|
||||
);
|
||||
|
||||
const isFeatureEnabled = useCallback(
|
||||
(feature: ExperimentalIndexingFeature) =>
|
||||
packagePolicy.package?.experimental_data_stream_features?.some(
|
||||
({ data_stream: dataStream, features }) =>
|
||||
dataStream ===
|
||||
getRegistryDataStreamAssetBaseName(packagePolicyInputStream.data_stream) &&
|
||||
features[feature]
|
||||
) ?? false,
|
||||
[
|
||||
packagePolicy.package?.experimental_data_stream_features,
|
||||
packagePolicyInputStream.data_stream,
|
||||
]
|
||||
);
|
||||
const setNewExperimentalDataFeatures = useCallback(
|
||||
(newFeatures: ExperimentalDataStreamFeature[]) => {
|
||||
if (!packagePolicy.package) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newExperimentalIndexingFeature = {
|
||||
synthetic_source: isFeatureEnabled('synthetic_source'),
|
||||
tsdb: isFeatureEnabled('tsdb'),
|
||||
};
|
||||
|
||||
const onIndexingSettingChange = (
|
||||
features: Partial<Record<ExperimentalIndexingFeature, boolean>>
|
||||
) => {
|
||||
if (!packagePolicy.package) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newExperimentalDataStreamFeatures = [
|
||||
...(packagePolicy.package.experimental_data_stream_features ?? []),
|
||||
];
|
||||
|
||||
const dataStream = getRegistryDataStreamAssetBaseName(packagePolicyInputStream.data_stream);
|
||||
|
||||
const existingSettingRecord = newExperimentalDataStreamFeatures.find(
|
||||
(x) => x.data_stream === dataStream
|
||||
);
|
||||
|
||||
if (existingSettingRecord) {
|
||||
existingSettingRecord.features = {
|
||||
...existingSettingRecord.features,
|
||||
...features,
|
||||
};
|
||||
} else {
|
||||
newExperimentalDataStreamFeatures.push({
|
||||
data_stream: dataStream,
|
||||
features: { ...newExperimentalIndexingFeature, ...features },
|
||||
updatePackagePolicy({
|
||||
package: {
|
||||
...packagePolicy.package,
|
||||
experimental_data_stream_features: newFeatures,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
updatePackagePolicy({
|
||||
package: {
|
||||
...packagePolicy.package,
|
||||
experimental_data_stream_features: newExperimentalDataStreamFeatures,
|
||||
},
|
||||
});
|
||||
};
|
||||
},
|
||||
[updatePackagePolicy, packagePolicy]
|
||||
);
|
||||
|
||||
const { data: dataStreamsData } = useGetDataStreams();
|
||||
const datasetList =
|
||||
|
@ -212,11 +170,12 @@ export const PackagePolicyInputStreamConfig = memo<Props>(
|
|||
/>
|
||||
</EuiFlexItem>
|
||||
)}
|
||||
{packagePolicyInputStream.release && packagePolicyInputStream.release !== 'ga' ? (
|
||||
{packageInputStream.data_stream.release &&
|
||||
packageInputStream.data_stream.release !== 'ga' ? (
|
||||
<EuiFlexItem grow={false}>
|
||||
<InlineReleaseBadge
|
||||
release={mapPackageReleaseToIntegrationCardRelease(
|
||||
packagePolicyInputStream.release
|
||||
packageInputStream.data_stream.release
|
||||
)}
|
||||
/>
|
||||
</EuiFlexItem>
|
||||
|
@ -346,81 +305,13 @@ export const PackagePolicyInputStreamConfig = memo<Props>(
|
|||
</>
|
||||
)}
|
||||
{/* Experimental index/datastream settings e.g. synthetic source */}
|
||||
<EuiFlexItem>
|
||||
<EuiFlexGroup direction="column" gutterSize="xs">
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiTitle size="xxxs">
|
||||
<h5>
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.packagePolicyEditor.experimentalSettings.title"
|
||||
defaultMessage="Indexing settings (experimental)"
|
||||
/>
|
||||
</h5>
|
||||
</EuiTitle>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem>
|
||||
<EuiText color="subdued" size="xs">
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.createPackagePolicy.stepConfigure.experimentalFeaturesDescription"
|
||||
defaultMessage="Select data streams to configure indexing options. This is an {experimentalFeature} and may have effects on other properties."
|
||||
values={{
|
||||
experimentalFeature: (
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.createPackagePolicy.experimentalFeatureText"
|
||||
defaultMessage="experimental feature"
|
||||
/>
|
||||
</strong>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
<EuiSpacer size="s" />
|
||||
<EuiFlexItem>
|
||||
<EuiSwitch
|
||||
checked={isFeatureEnabled('synthetic_source')}
|
||||
label={
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.createPackagePolicy.experimentalFeatures.syntheticSourceLabel"
|
||||
defaultMessage="Synthetic source"
|
||||
/>
|
||||
}
|
||||
onChange={(e) => {
|
||||
onIndexingSettingChange({
|
||||
synthetic_source: e.target.checked,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem>
|
||||
<EuiToolTip
|
||||
content={
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.createPackagePolicy.experimentalFeatures.TSDBTooltip"
|
||||
defaultMessage="Enabling this feature is irreversible"
|
||||
/>
|
||||
}
|
||||
>
|
||||
<EuiSwitch
|
||||
disabled={isFeatureEnabled('tsdb')}
|
||||
checked={isFeatureEnabled('tsdb')}
|
||||
label={
|
||||
<FormattedMessage
|
||||
id="xpack.fleet.createPackagePolicy.experimentalFeatures.TSDBLabel"
|
||||
defaultMessage="Time-series indexing (TSDB)"
|
||||
/>
|
||||
}
|
||||
onChange={(e) => {
|
||||
onIndexingSettingChange({
|
||||
tsdb: e.target.checked,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</EuiToolTip>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
</EuiFlexItem>
|
||||
<ExperimentDatastreamSettings
|
||||
registryDataStream={packageInputStream.data_stream}
|
||||
experimentalDataFeatures={
|
||||
packagePolicy.package?.experimental_data_stream_features
|
||||
}
|
||||
setNewExperimentalDataFeatures={setNewExperimentalDataFeatures}
|
||||
/>
|
||||
</>
|
||||
) : null}
|
||||
</Fragment>
|
||||
|
|
|
@ -18,11 +18,12 @@ import { FormattedMessage } from '@kbn/i18n-react';
|
|||
import {
|
||||
getNormalizedInputs,
|
||||
isIntegrationPolicyTemplate,
|
||||
getRegistryStreamWithDataStreamForInputType,
|
||||
} from '../../../../../../../../common/services';
|
||||
|
||||
import type { PackageInfo, NewPackagePolicy, NewPackagePolicyInput } from '../../../../../types';
|
||||
import { Loading } from '../../../../../components';
|
||||
import { getStreamsForInputType, doesPackageHaveIntegrations } from '../../../../../services';
|
||||
import { doesPackageHaveIntegrations } from '../../../../../services';
|
||||
|
||||
import type { PackagePolicyValidationResults } from '../../services';
|
||||
|
||||
|
@ -69,7 +70,7 @@ export const StepConfigurePackagePolicy: React.FunctionComponent<{
|
|||
input.type === packageInput.type &&
|
||||
(hasIntegrations ? input.policy_template === policyTemplate.name : true)
|
||||
);
|
||||
const packageInputStreams = getStreamsForInputType(
|
||||
const packageInputStreams = getRegistryStreamWithDataStreamForInputType(
|
||||
packageInput.type,
|
||||
packageInfo,
|
||||
hasIntegrations && isIntegrationPolicyTemplate(policyTemplate)
|
||||
|
|
|
@ -125,7 +125,6 @@ describe('when on the package policy create page', () => {
|
|||
name: 'nginx',
|
||||
title: 'Nginx',
|
||||
version: '1.3.0',
|
||||
release: 'ga',
|
||||
description: 'Collect logs and metrics from Nginx HTTP servers with Elastic Agent.',
|
||||
policy_templates: [
|
||||
{
|
||||
|
@ -147,7 +146,6 @@ describe('when on the package policy create page', () => {
|
|||
type: 'logs',
|
||||
dataset: 'nginx.access',
|
||||
title: 'Nginx access logs',
|
||||
release: 'experimental',
|
||||
ingest_pipeline: 'default',
|
||||
streams: [
|
||||
{
|
||||
|
@ -239,7 +237,6 @@ describe('when on the package policy create page', () => {
|
|||
dataset: 'nginx.access',
|
||||
type: 'logs',
|
||||
},
|
||||
release: 'experimental',
|
||||
enabled: true,
|
||||
vars: {
|
||||
paths: {
|
||||
|
@ -537,7 +534,6 @@ describe('when on the package policy create page', () => {
|
|||
streams: [
|
||||
{
|
||||
...newPackagePolicy.inputs[0].streams[0],
|
||||
release: 'experimental',
|
||||
vars: {
|
||||
paths: {
|
||||
type: 'text',
|
||||
|
|
|
@ -102,6 +102,7 @@ export type {
|
|||
RegistryVarsEntry,
|
||||
RegistryInput,
|
||||
RegistryStream,
|
||||
RegistryStreamWithDataStream,
|
||||
RegistryPolicyTemplate,
|
||||
PackageList,
|
||||
PackageListItem,
|
||||
|
|
|
@ -1753,7 +1753,6 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
{
|
||||
enabled: true,
|
||||
data_stream: { type: 'synthetics', dataset: 'http' },
|
||||
release: 'experimental',
|
||||
vars: {
|
||||
__ui: { value: '{"is_tls_enabled":false}', type: 'yaml' },
|
||||
enabled: { value: false, type: 'bool' },
|
||||
|
|
|
@ -31,7 +31,6 @@ export const getTestSyntheticsPolicy = (
|
|||
{
|
||||
enabled: true,
|
||||
data_stream: { type: 'synthetics', dataset: 'http' },
|
||||
release: 'experimental',
|
||||
vars: {
|
||||
__ui: {
|
||||
value:
|
||||
|
@ -133,7 +132,6 @@ export const getTestSyntheticsPolicy = (
|
|||
streams: [
|
||||
{
|
||||
enabled: false,
|
||||
release: 'experimental',
|
||||
data_stream: { type: 'synthetics', dataset: 'tcp' },
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
|
@ -174,7 +172,6 @@ export const getTestSyntheticsPolicy = (
|
|||
streams: [
|
||||
{
|
||||
enabled: false,
|
||||
release: 'experimental',
|
||||
data_stream: { type: 'synthetics', dataset: 'icmp' },
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
|
@ -206,7 +203,6 @@ export const getTestSyntheticsPolicy = (
|
|||
streams: [
|
||||
{
|
||||
enabled: true,
|
||||
release: 'beta',
|
||||
data_stream: { type: 'synthetics', dataset: 'browser' },
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
|
@ -264,7 +260,6 @@ export const getTestSyntheticsPolicy = (
|
|||
{
|
||||
enabled: true,
|
||||
data_stream: { type: 'synthetics', dataset: 'browser.network' },
|
||||
release: 'beta',
|
||||
id: 'synthetics/browser-browser.network-2bfd7da0-22ed-11ed-8c6b-09a2d21dfbc3-27337270-22ed-11ed-8c6b-09a2d21dfbc3-default',
|
||||
compiled_stream: {
|
||||
processors: [
|
||||
|
@ -276,7 +271,6 @@ export const getTestSyntheticsPolicy = (
|
|||
{
|
||||
enabled: true,
|
||||
data_stream: { type: 'synthetics', dataset: 'browser.screenshot' },
|
||||
release: 'beta',
|
||||
id: 'synthetics/browser-browser.screenshot-2bfd7da0-22ed-11ed-8c6b-09a2d21dfbc3-27337270-22ed-11ed-8c6b-09a2d21dfbc3-default',
|
||||
compiled_stream: {
|
||||
processors: [
|
||||
|
@ -332,7 +326,6 @@ export const getTestProjectSyntheticsPolicy = (
|
|||
{
|
||||
enabled: false,
|
||||
data_stream: { type: 'synthetics', dataset: 'http' },
|
||||
release: 'experimental',
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
enabled: { value: true, type: 'bool' },
|
||||
|
@ -382,7 +375,6 @@ export const getTestProjectSyntheticsPolicy = (
|
|||
{
|
||||
enabled: false,
|
||||
data_stream: { type: 'synthetics', dataset: 'tcp' },
|
||||
release: 'experimental',
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
enabled: { value: true, type: 'bool' },
|
||||
|
@ -422,7 +414,6 @@ export const getTestProjectSyntheticsPolicy = (
|
|||
streams: [
|
||||
{
|
||||
enabled: false,
|
||||
release: 'experimental',
|
||||
data_stream: { type: 'synthetics', dataset: 'icmp' },
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
|
@ -455,7 +446,6 @@ export const getTestProjectSyntheticsPolicy = (
|
|||
{
|
||||
enabled: true,
|
||||
data_stream: { type: 'synthetics', dataset: 'browser' },
|
||||
release: 'beta',
|
||||
vars: {
|
||||
__ui: {
|
||||
value:
|
||||
|
@ -547,7 +537,6 @@ export const getTestProjectSyntheticsPolicy = (
|
|||
},
|
||||
{
|
||||
enabled: true,
|
||||
release: 'beta',
|
||||
data_stream: { type: 'synthetics', dataset: 'browser.network' },
|
||||
id: `synthetics/browser-browser.network-4b6abc6c-118b-4d93-a489-1135500d09f1-${projectId}-default-d70a46e0-22ea-11ed-8c6b-09a2d21dfbc3`,
|
||||
compiled_stream: {
|
||||
|
@ -559,7 +548,6 @@ export const getTestProjectSyntheticsPolicy = (
|
|||
},
|
||||
{
|
||||
enabled: true,
|
||||
release: 'beta',
|
||||
data_stream: { type: 'synthetics', dataset: 'browser.screenshot' },
|
||||
id: `synthetics/browser-browser.screenshot-4b6abc6c-118b-4d93-a489-1135500d09f1-${projectId}-default-d70a46e0-22ea-11ed-8c6b-09a2d21dfbc3`,
|
||||
compiled_stream: {
|
||||
|
|
|
@ -21,7 +21,6 @@ export default function (providerContext: FtrProviderContext) {
|
|||
streams: [
|
||||
{
|
||||
enabled: true,
|
||||
release: 'beta',
|
||||
data_stream: { type: 'synthetics', dataset: 'browser' },
|
||||
vars: {
|
||||
__ui: { type: 'yaml' },
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue