[Fleet] Honor registry datastream source_mode in package policy editor UI (#147034)

This commit is contained in:
Nicolas Chaulet 2022-12-07 10:25:52 -05:00 committed by GitHub
parent 6d5b292638
commit f8fea0fb93
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 380 additions and 188 deletions

View file

@ -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",

View file

@ -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",

View file

@ -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';

View file

@ -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, {});

View file

@ -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 {

View file

@ -34,6 +34,7 @@ export interface NewPackagePolicyInputStream {
indices?: string[];
};
index_mode?: string;
source_mode?: string;
};
};
release?: RegistryRelease;

View file

@ -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();
});
});
});

View file

@ -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>
);
};

View file

@ -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;

View file

@ -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>

View file

@ -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)

View file

@ -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',

View file

@ -102,6 +102,7 @@ export type {
RegistryVarsEntry,
RegistryInput,
RegistryStream,
RegistryStreamWithDataStream,
RegistryPolicyTemplate,
PackageList,
PackageListItem,

View file

@ -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' },

View file

@ -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: {

View file

@ -21,7 +21,6 @@ export default function (providerContext: FtrProviderContext) {
streams: [
{
enabled: true,
release: 'beta',
data_stream: { type: 'synthetics', dataset: 'browser' },
vars: {
__ui: { type: 'yaml' },