Skip to content

Commit

Permalink
Add DI for safeload in output helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
kpollich committed Dec 6, 2023
1 parent bd9979e commit 0b90335
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 16 deletions.
17 changes: 11 additions & 6 deletions x-pack/plugins/fleet/common/services/output_helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@
* 2.0.
*/

import { safeLoad } from 'js-yaml';
import { isObject } from 'lodash';

import { getFlattenedObject } from '@kbn/std';

import { isObject } from 'lodash';

import type { AgentPolicy, OutputType, ValueOf } from '../types';
import {
FLEET_APM_PACKAGE,
Expand Down Expand Up @@ -42,7 +40,11 @@ export function getAllowedOutputTypeForPolicy(agentPolicy: AgentPolicy) {
return Object.values(outputType);
}

export function outputYmlIncludesReservedPerformanceKey(configYml: string) {
export function outputYmlIncludesReservedPerformanceKey(
configYml: string,
// Dependency injection for `safeLoad` prevents bundle size issues 🤷‍♀️
safeLoad: (yml: string) => any
) {
if (!configYml || configYml === '') {
return false;
}
Expand All @@ -58,8 +60,11 @@ export function outputYmlIncludesReservedPerformanceKey(configYml: string) {
return RESERVED_CONFIG_YML_KEYS.some((key) => Object.keys(flattenedYml).includes(key));
}

export function getDefaultPresetForEsOutput(configYaml: string): 'balanced' | 'custom' {
if (outputYmlIncludesReservedPerformanceKey(configYaml)) {
export function getDefaultPresetForEsOutput(
configYaml: string,
safeLoad: (yml: string) => any
): 'balanced' | 'custom' {
if (outputYmlIncludesReservedPerformanceKey(configYaml, safeLoad)) {
return 'custom';
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import React, { useMemo } from 'react';
import { FormattedMessage } from '@kbn/i18n-react';
import { safeLoad } from 'js-yaml';

import {
EuiFlyout,
Expand Down Expand Up @@ -583,7 +584,8 @@ export const EditOutputFlyout: React.FunctionComponent<EditOutputFlyoutProps> =
disabled={
inputs.presetInput.props.disabled ||
outputYmlIncludesReservedPerformanceKey(
inputs.additionalYamlConfigInput.value
inputs.additionalYamlConfigInput.value,
safeLoad
)
}
options={[
Expand All @@ -600,7 +602,10 @@ export const EditOutputFlyout: React.FunctionComponent<EditOutputFlyoutProps> =
)}

{supportsPresets &&
outputYmlIncludesReservedPerformanceKey(inputs.additionalYamlConfigInput.value) && (
outputYmlIncludesReservedPerformanceKey(
inputs.additionalYamlConfigInput.value,
safeLoad
) && (
<>
<EuiSpacer size="s" />
<EuiCallOut
Expand Down Expand Up @@ -650,7 +655,7 @@ export const EditOutputFlyout: React.FunctionComponent<EditOutputFlyoutProps> =
<YamlCodeEditorWithPlaceholder
value={inputs.additionalYamlConfigInput.value}
onChange={(value) => {
if (outputYmlIncludesReservedPerformanceKey(value)) {
if (outputYmlIncludesReservedPerformanceKey(value, safeLoad)) {
inputs.presetInput.setValue('custom');
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ export function useOutputForm(onSucess: () => void, output?: Output) {
);

const presetInput = useInput(
output?.preset ?? getDefaultPresetForEsOutput(output?.config_yaml ?? ''),
output?.preset ?? getDefaultPresetForEsOutput(output?.config_yaml ?? '', safeLoad),
() => undefined,
isDisabled('preset')
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ export function transformOutputToFullPolicyOutput(
}

if (outputTypeSupportPresets(output.type)) {
newOutput.preset = preset ?? getDefaultPresetForEsOutput(config_yaml ?? '');
newOutput.preset = preset ?? getDefaultPresetForEsOutput(config_yaml ?? '', safeLoad);
}

return newOutput;
Expand Down
10 changes: 5 additions & 5 deletions x-pack/plugins/fleet/server/services/output.ts
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@ class OutputService {
if (outputTypeSupportPresets(data.type)) {
if (
data.preset === 'balanced' &&
outputYmlIncludesReservedPerformanceKey(output.config_yaml ?? '')
outputYmlIncludesReservedPerformanceKey(output.config_yaml ?? '', safeLoad)
) {
throw new OutputInvalidError(
`preset cannot be balanced when config_yaml contains one of ${RESERVED_CONFIG_YML_KEYS.join(
Expand Down Expand Up @@ -524,7 +524,7 @@ class OutputService {
}

if (!data.preset && data.type === outputType.Elasticsearch) {
data.preset = getDefaultPresetForEsOutput(data.config_yaml ?? '');
data.preset = getDefaultPresetForEsOutput(data.config_yaml ?? '', safeLoad);
}

if (output.config_yaml) {
Expand Down Expand Up @@ -783,7 +783,7 @@ class OutputService {
if (updateData.type && outputTypeSupportPresets(updateData.type)) {
if (
updateData.preset === 'balanced' &&
outputYmlIncludesReservedPerformanceKey(updateData.config_yaml ?? '')
outputYmlIncludesReservedPerformanceKey(updateData.config_yaml ?? '', safeLoad)
) {
throw new OutputInvalidError(
`preset cannot be balanced when config_yaml contains one of ${RESERVED_CONFIG_YML_KEYS.join(
Expand Down Expand Up @@ -969,7 +969,7 @@ class OutputService {
}

if (!data.preset && data.type === outputType.Elasticsearch) {
updateData.preset = getDefaultPresetForEsOutput(data.config_yaml ?? '');
updateData.preset = getDefaultPresetForEsOutput(data.config_yaml ?? '', safeLoad);
}

// Remove the shipper data if the shipper is not enabled from the yaml config
Expand Down Expand Up @@ -1021,7 +1021,7 @@ class OutputService {
await pMap(
outputs.items.filter((output) => outputTypeSupportPresets(output.type) && !output.preset),
async (output) => {
const preset = getDefaultPresetForEsOutput(output.config_yaml ?? '');
const preset = getDefaultPresetForEsOutput(output.config_yaml ?? '', safeLoad);

await outputService.update(soClient, esClient, output.id, { preset });
await agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, output.id);
Expand Down

0 comments on commit 0b90335

Please sign in to comment.