Skip to content

Commit

Permalink
Revert "[Synthetics] Revert 8.15 public API responses (elastic#195295)…
Browse files Browse the repository at this point in the history
…" (elastic#198511)

Fixes elastic#198518
This reverts commit d21495b and 


## Testing

Create few HTTP, ICMP, TCP and Browser monitors via API in 8.15 and in
this PR

Compared JSOn diffs to make sure responses are same
  • Loading branch information
shahzad31 authored and nreese committed Nov 1, 2024
1 parent 232c794 commit 3f21aad
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 115 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ describe('mergeSourceMonitor', () => {
const result = mapSavedObjectToMonitor({ monitor: { attributes: testMonitor } } as any);

expect(result).toEqual({
__ui: {
is_tls_enabled: false,
},
alert: {
status: {
enabled: true,
Expand All @@ -78,53 +81,48 @@ describe('mergeSourceMonitor', () => {
enabled: true,
},
},
'check.request.method': 'GET',
'check.response.status': ['404'],
config_id: 'ae88f0aa-9c7d-4a5f-96dc-89d65a0ca947',
custom_heartbeat_id: 'todos-lightweight-test-projects-default',
enabled: true,
id: 'todos-lightweight-test-projects-default',
ipv4: true,
ipv6: true,
locations: ['us_central', 'us_east'],
private_locations: ['pvt_us_east'],
max_redirects: 0,
locations: [
{
geo: {
lat: 41.25,
lon: -95.86,
},
id: 'us_central',
isServiceManaged: true,
label: 'North America - US Central',
},
],
max_attempts: 2,
max_redirects: '0',
mode: 'any',
name: 'Todos Lightweight',
namespace: 'default',
origin: 'project',
original_space: 'default',
proxy_url: '',
project_id: 'test-projects',
'response.include_body': 'on_error',
'response.include_body_max_bytes': '1024',
'response.include_headers': true,
retest_on_failure: true,
revision: 21,
schedule: {
number: '3',
unit: 'm',
},
'service.name': '',
tags: [],
'ssl.key': 'test-key',
'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'],
'ssl.verification_mode': 'full',
timeout: '16',
type: 'http',
url: '${devUrl}',
'url.port': null,
ssl: {
certificate: '',
certificate_authorities: '',
supported_protocols: ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'],
verification_mode: 'full',
key: 'test-key',
},
response: {
include_body: 'on_error',
include_body_max_bytes: '1024',
include_headers: true,
},
check: {
request: {
method: 'GET',
},
response: {
status: ['404'],
},
},
params: {},
});
});

Expand Down Expand Up @@ -157,30 +155,12 @@ describe('mergeSourceMonitor', () => {
locations: [
{
geo: {
lon: -95.86,
lat: 41.25,
},
isServiceManaged: true,
id: 'us_central',
label: 'North America - US Central',
},
{
geo: {
lon: -95.86,
lat: 41.25,
},
id: 'us_central',
isServiceManaged: true,
id: 'us-east4-a',
label: 'US East',
},
{
geo: {
lon: -95.86,
lat: 41.25,
},
isServiceManaged: false,
id: 'pvt_us_east',
label: 'US East (Private)',
label: 'North America - US Central',
},
],
max_redirects: '0',
Expand Down Expand Up @@ -249,24 +229,6 @@ const testMonitor = {
id: 'us_central',
label: 'North America - US Central',
},
{
geo: {
lon: -95.86,
lat: 41.25,
},
isServiceManaged: true,
id: 'us-east4-a',
label: 'US East',
},
{
geo: {
lon: -95.86,
lat: 41.25,
},
isServiceManaged: false,
id: 'pvt_us_east',
label: 'US East (Private)',
},
],
namespace: 'default',
origin: 'project',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import { SavedObject } from '@kbn/core/server';
import { mergeWith, omit, omitBy } from 'lodash';
import { LocationsMap } from '../../../synthetics_service/project_monitor/normalizers/common_fields';
import {
ConfigKey,
EncryptedSyntheticsMonitor,
Expand All @@ -22,14 +21,6 @@ const keysToOmit = [
ConfigKey.CONFIG_HASH,
ConfigKey.JOURNEY_ID,
ConfigKey.FORM_MONITOR_TYPE,
ConfigKey.MAX_ATTEMPTS,
ConfigKey.MONITOR_SOURCE_TYPE,
ConfigKey.METADATA,
ConfigKey.SOURCE_PROJECT_CONTENT,
ConfigKey.PROJECT_ID,
ConfigKey.JOURNEY_FILTERS_MATCH,
ConfigKey.JOURNEY_FILTERS_TAGS,
ConfigKey.MONITOR_SOURCE_TYPE,
];

type Result = MonitorFieldsResult & {
Expand All @@ -39,14 +30,25 @@ type Result = MonitorFieldsResult & {
ssl: Record<string, any>;
response: Record<string, any>;
check: Record<string, any>;
locations: string[];
private_locations: string[];
};

export const transformPublicKeys = (result: Result) => {
if (result[ConfigKey.SOURCE_INLINE]) {
result.inline_script = result[ConfigKey.SOURCE_INLINE];
}
if (result[ConfigKey.HOSTS]) {
result.host = result[ConfigKey.HOSTS];
}
if (result[ConfigKey.PARAMS]) {
try {
result[ConfigKey.PARAMS] = JSON.parse(result[ConfigKey.PARAMS] ?? '{}');
} catch (e) {
// ignore
}
}

let formattedResult = {
...result,
...formatLocations(result),
[ConfigKey.PARAMS]: formatParams(result),
retest_on_failure: (result[ConfigKey.MAX_ATTEMPTS] ?? 1) > 1,
...(result[ConfigKey.HOSTS] && { host: result[ConfigKey.HOSTS] }),
Expand All @@ -58,20 +60,8 @@ export const transformPublicKeys = (result: Result) => {
...(result[ConfigKey.SOURCE_INLINE] && { inline_script: result[ConfigKey.SOURCE_INLINE] }),
[ConfigKey.PLAYWRIGHT_OPTIONS]: formatPWOptions(result),
};
} else {
formattedResult.ssl = formatNestedFields(formattedResult, 'ssl');
formattedResult.response = formatNestedFields(formattedResult, 'response');
formattedResult.check = formatNestedFields(formattedResult, 'check');
if (formattedResult[ConfigKey.MAX_REDIRECTS]) {
formattedResult[ConfigKey.MAX_REDIRECTS] = Number(formattedResult[ConfigKey.MAX_REDIRECTS]);
}
}
const res = omit(formattedResult, keysToOmit) as Result;

return omitBy(
res,
(_, key) => key.startsWith('response.') || key.startsWith('ssl.') || key.startsWith('check.')
);
return omit(formattedResult, keysToOmit) as Result;
};

export function mapSavedObjectToMonitor({
Expand All @@ -81,15 +71,17 @@ export function mapSavedObjectToMonitor({
monitor: SavedObject<MonitorFields | EncryptedSyntheticsMonitor>;
internal?: boolean;
}) {
const result = {
let result = {
...monitor.attributes,
created_at: monitor.created_at,
updated_at: monitor.updated_at,
} as Result;
if (internal) {
return result;
}
return transformPublicKeys(result);
result = transformPublicKeys(result);
// omit undefined value or null value
return omitBy(result, removeMonitorEmptyValues);
}
export function mergeSourceMonitor(
normalizedPreviousMonitor: EncryptedSyntheticsMonitor,
Expand All @@ -108,24 +100,6 @@ const customizer = (destVal: any, srcValue: any, key: string) => {
}
};

const formatLocations = (config: MonitorFields) => {
const locMap = Object.entries(LocationsMap);
const locations = config[ConfigKey.LOCATIONS]
?.filter((location) => location.isServiceManaged)
.map((location) => {
return locMap.find(([_key, value]) => value === location.id)?.[0] ?? location.id;
});

const privateLocations = config[ConfigKey.LOCATIONS]
?.filter((location) => !location.isServiceManaged)
.map((location) => location.id);

return {
...(locations && { locations }),
...(privateLocations && { private_locations: privateLocations }),
};
};

const formatParams = (config: MonitorFields) => {
if (config[ConfigKey.PARAMS]) {
try {
Expand Down Expand Up @@ -177,3 +151,17 @@ const formatNestedFields = (

return obj;
};

export const removeMonitorEmptyValues = (v: any) => {
// value is falsy
return (
v === undefined ||
v === null ||
// value is empty string
(typeof v === 'string' && v.trim() === '') ||
// is empty array
(Array.isArray(v) && v.length === 0) ||
// object is has no values
(typeof v === 'object' && Object.keys(v).length === 0)
);
};
9 changes: 6 additions & 3 deletions x-pack/test/api_integration/apis/synthetics/add_monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import expect from '@kbn/expect';
import epct from 'expect';
import moment from 'moment/moment';
import { v4 as uuidv4 } from 'uuid';
import { omit } from 'lodash';
import { omit, omitBy } from 'lodash';
import {
ConfigKey,
MonitorTypeEnum,
Expand All @@ -23,7 +23,10 @@ import { format as formatUrl } from 'url';
import supertest from 'supertest';
import { getServiceApiKeyPrivileges } from '@kbn/synthetics-plugin/server/synthetics_service/get_api_key';
import { syntheticsMonitorType } from '@kbn/synthetics-plugin/common/types/saved_objects';
import { transformPublicKeys } from '@kbn/synthetics-plugin/server/routes/monitor_cruds/formatters/saved_object_to_monitor';
import {
removeMonitorEmptyValues,
transformPublicKeys,
} from '@kbn/synthetics-plugin/server/routes/monitor_cruds/formatters/saved_object_to_monitor';
import { FtrProviderContext } from '../../ftr_provider_context';
import { getFixtureJson } from './helper/get_fixture_json';
import { SyntheticsMonitorTestService } from './services/synthetics_monitor_test_service';
Expand Down Expand Up @@ -61,7 +64,7 @@ export const keyToOmitList = [
];

export const omitMonitorKeys = (monitor: any) => {
return omit(transformPublicKeys(monitor), keyToOmitList);
return omitBy(omit(transformPublicKeys(monitor), keyToOmitList), removeMonitorEmptyValues);
};

export default function ({ getService }: FtrProviderContext) {
Expand Down
1 change: 0 additions & 1 deletion x-pack/test/api_integration/apis/synthetics/get_monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,6 @@ export default function ({ getService }: FtrProviderContext) {
revision: 1,
locations: [LOCAL_LOCATION],
name: 'Test HTTP Monitor 044',
labels: {},
})
);
});
Expand Down

0 comments on commit 3f21aad

Please sign in to comment.