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

(cherry picked from commit 184d9a0)
  • Loading branch information
shahzad31 committed Oct 31, 2024
1 parent 7dc66db commit 6e9be03
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 6e9be03

Please sign in to comment.