Skip to content

Commit 5cc7014

Browse files
authored
[Fleet] Support global data tags for agentless (elastic#263522)
1 parent 135ed57 commit 5cc7014

20 files changed

Lines changed: 1208 additions & 35 deletions

File tree

oas_docs/output/kibana.serverless.yaml

Lines changed: 322 additions & 0 deletions
Large diffs are not rendered by default.

oas_docs/output/kibana.yaml

Lines changed: 322 additions & 0 deletions
Large diffs are not rendered by default.

packages/kbn-babel-preset/styled_components_files.js

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/platform/plugins/shared/fleet/common/services/simplified_package_policy_helper.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ export interface SimplifiedPackagePolicy {
6868
supports_agentless?: boolean | null;
6969
supports_cloud_connector?: boolean | null;
7070
additional_datastreams_permissions?: string[] | null;
71+
// Only available for agentless integration policies.
72+
// On standard package policies this field is rejected by server-side validation.
73+
global_data_tags?: Array<{ name: string; value: string | number }> | null;
7174
}
7275

7376
export interface FormattedPackagePolicy extends Omit<PackagePolicy, 'inputs' | 'vars'> {
@@ -195,6 +198,7 @@ export function simplifiedPackagePolicytoNewPackagePolicy(
195198
supports_cloud_connector: supportsCloudConnector,
196199
cloud_connector_id: cloudConnectorId,
197200
additional_datastreams_permissions: additionalDatastreamsPermissions,
201+
global_data_tags: globalDataTags,
198202
} = data;
199203
const packagePolicy = {
200204
...packageToPackagePolicy(
@@ -216,6 +220,10 @@ export function simplifiedPackagePolicytoNewPackagePolicy(
216220
packagePolicy.additional_datastreams_permissions = additionalDatastreamsPermissions;
217221
}
218222

223+
if (globalDataTags) {
224+
packagePolicy.global_data_tags = globalDataTags;
225+
}
226+
219227
if (packagePolicy.package && options?.experimental_data_stream_features) {
220228
packagePolicy.package.experimental_data_stream_features =
221229
options.experimental_data_stream_features;

x-pack/platform/plugins/shared/fleet/common/types/models/package_policy.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import type { RegistryRelease, ExperimentalDataStreamFeature, DeprecationInfo } from './epm';
99
import type { SecretReference } from './secret';
10+
import type { GlobalDataTag } from './agent_policy';
1011

1112
export interface PackagePolicyPackage {
1213
name: string;
@@ -109,6 +110,7 @@ export interface NewPackagePolicy {
109110
supports_agentless?: boolean | null;
110111
supports_cloud_connector?: boolean | null;
111112
additional_datastreams_permissions?: string[];
113+
global_data_tags?: GlobalDataTag[];
112114
}
113115

114116
export interface UpdatePackagePolicy extends NewPackagePolicy {

x-pack/platform/plugins/shared/fleet/common/types/models/package_policy_schema.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,24 @@ export const PackagePolicyBaseSchema = {
265265
])
266266
),
267267
package_agent_version_condition: schema.maybe(schema.string()),
268+
// Only available for agentless integration policies.
269+
// On standard package policies this field is rejected by server-side validation.
270+
global_data_tags: schema.maybe(
271+
schema.oneOf([
272+
schema.literal(null),
273+
schema.arrayOf(
274+
schema.object({
275+
name: schema.string({
276+
meta: { description: 'The name of the custom field. Cannot contain spaces.' },
277+
}),
278+
value: schema.oneOf([schema.string(), schema.number()], {
279+
meta: { description: 'The value of the custom field.' },
280+
}),
281+
}),
282+
{ maxSize: 100 }
283+
),
284+
])
285+
),
268286
};
269287

270288
export const NewPackagePolicySchema = schema.object({
@@ -284,6 +302,20 @@ export const PackagePolicySchemaV22 = NewPackagePolicySchema.extends(
284302
enabled: schema.maybe(schema.boolean()),
285303
inputs: schema.maybe(schema.arrayOf(schema.any(), { maxSize: 1000 })),
286304
package: schema.maybe(schema.any()),
305+
global_data_tags: undefined,
306+
},
307+
{ unknowns: 'ignore' }
308+
);
309+
310+
/**
311+
* Snapshot of the package policy SO schema as of model version 10.23.0.
312+
* Permissive on enabled, inputs, and package so the SO layer can store
313+
* internal shapes (e.g. compiled_input, minimal fixtures). If NewPackagePolicySchema
314+
* gains new fields, create PackagePolicySchemaV{next} that extends this one.
315+
*/
316+
export const PackagePolicySchemaV23 = PackagePolicySchemaV22.extends(
317+
{
318+
global_data_tags: NewPackagePolicySchema.getPropSchemas().global_data_tags,
287319
},
288320
{ unknowns: 'ignore' }
289321
);

x-pack/platform/plugins/shared/fleet/common/types/rest_spec/agentless_policy.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,23 @@ export const CreateAgentlessPolicyRequestSchema = {
3535
},
3636
})
3737
),
38+
// Only available for agentless integration policies.
39+
// On standard package policies this field is rejected by server-side validation.
40+
global_data_tags: schema.maybe(
41+
schema.arrayOf(
42+
schema.object({
43+
name: schema.string({
44+
meta: { description: 'The name of the custom field. Cannot contain spaces.' },
45+
}),
46+
value: schema.oneOf([schema.string(), schema.number()], {
47+
meta: { description: 'The value of the custom field.' },
48+
}),
49+
}),
50+
{
51+
maxSize: 100,
52+
}
53+
)
54+
),
3855
// Cloud connector configuration - all connector settings go here
3956
cloud_connector: schema.maybe(
4057
schema.object({

x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/custom_fields/index.test.tsx renamed to x-pack/platform/plugins/shared/fleet/public/applications/fleet/components/custom_fields/agent_policy_custom_fields.test.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,28 @@
88
import React from 'react';
99
import type { RenderResult } from '@testing-library/react';
1010

11-
import type { TestRenderer } from '../../../../../../../mock';
12-
import { createFleetTestRendererMock } from '../../../../../../../mock';
11+
import type { TestRenderer } from '../../../../mock';
12+
import { createFleetTestRendererMock } from '../../../../mock';
1313

14-
import type { NewAgentPolicy, AgentPolicy, PackagePolicyInput } from '../../../../../types';
14+
import type { NewAgentPolicy, AgentPolicy, PackagePolicyInput } from '../../types';
1515

16-
import { GLOBAL_DATA_TAG_EXCLUDED_INPUTS } from '../../../../../../../../common/constants';
16+
import { GLOBAL_DATA_TAG_EXCLUDED_INPUTS } from '../../../../../common/constants';
1717

18-
import {
19-
createAgentPolicyMock,
20-
createPackagePolicyMock,
21-
} from '../../../../../../../../common/mocks';
18+
import { createAgentPolicyMock, createPackagePolicyMock } from '../../../../../common/mocks';
2219

23-
import { CustomFields } from '.';
20+
import { AgentPolicyCustomFields } from './agent_policy_custom_fields';
2421

25-
describe('CustomFields', () => {
22+
describe('AgentPolicyCustomFields', () => {
2623
let testRenderer: TestRenderer;
2724
let renderResult: RenderResult;
2825
const mockUpdateAgentPolicy = jest.fn();
2926

3027
const renderComponent = (agentPolicy: Partial<AgentPolicy | NewAgentPolicy>) => {
3128
renderResult = testRenderer.render(
32-
<CustomFields agentPolicy={agentPolicy} updateAgentPolicy={mockUpdateAgentPolicy} />
29+
<AgentPolicyCustomFields
30+
agentPolicy={agentPolicy}
31+
updateAgentPolicy={mockUpdateAgentPolicy}
32+
/>
3333
);
3434
};
3535

x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/custom_fields/index.tsx renamed to x-pack/platform/plugins/shared/fleet/public/applications/fleet/components/custom_fields/agent_policy_custom_fields.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,13 @@
55
* 2.0.
66
*/
77
import React from 'react';
8-
import styled from 'styled-components';
8+
import styled from '@emotion/styled';
99
import { EuiDescribedFormGroup, EuiSpacer, EuiCallOut } from '@elastic/eui';
1010
import { FormattedMessage } from '@kbn/i18n-react';
1111

12-
import type {
13-
NewAgentPolicy,
14-
AgentPolicy,
15-
PackagePolicy,
16-
PackagePolicyInput,
17-
} from '../../../../../types';
12+
import type { NewAgentPolicy, AgentPolicy, PackagePolicy, PackagePolicyInput } from '../../types';
1813

19-
import { GLOBAL_DATA_TAG_EXCLUDED_INPUTS } from '../../../../../../../../common/constants';
14+
import { GLOBAL_DATA_TAG_EXCLUDED_INPUTS } from '../../../../../common/constants';
2015

2116
import { GlobalDataTagsTable } from './global_data_tags_table';
2217

@@ -33,7 +28,7 @@ const DescribedFormGroup = styled(EuiDescribedFormGroup)`
3328
}
3429
`;
3530

36-
export const CustomFields: React.FunctionComponent<Props> = ({
31+
export const AgentPolicyCustomFields: React.FunctionComponent<Props> = ({
3732
agentPolicy,
3833
updateAgentPolicy,
3934
isDisabled,

x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/custom_fields/global_data_tags_table.test.tsx renamed to x-pack/platform/plugins/shared/fleet/public/applications/fleet/components/custom_fields/global_data_tags_table.test.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import React from 'react';
1010
import type { RenderResult } from '@testing-library/react';
1111
import { fireEvent, act } from '@testing-library/react';
1212

13-
import { createFleetTestRendererMock, type TestRenderer } from '../../../../../../../mock';
14-
import type { GlobalDataTag } from '../../../../../../../../common/types';
13+
import { createFleetTestRendererMock, type TestRenderer } from '../../../../mock';
14+
import type { GlobalDataTag } from '../../../../../common/types';
1515

1616
import { GlobalDataTagsTable } from './global_data_tags_table';
1717

18-
jest.mock('../../../../../../../hooks/use_fleet_status', () => ({
18+
jest.mock('../../../../hooks/use_fleet_status', () => ({
1919
FleetStatusProvider: (props: any) => {
2020
return props.children;
2121
},

0 commit comments

Comments
 (0)