mirror of
https://github.com/elastic/kibana.git
synced 2025-06-28 11:05:39 -04:00
Fix email connector rule URL (#162954)
Closes #162953 ## Summary This PR fixes the issue of adding basePath (`/kibana` in the following example) twice when generating the rule URL for the email connector. **Before** ``` 1.48e02d00
-3106-11ee-99f4-39221cc3f357 2.e36f8b70
-3135-11ee-9808-139f80c124ca ``` **After** ``` 1.48e02d00
-3106-11ee-99f4-39221cc3f357 2.e36f8b70
-3135-11ee-9808-139f80c124ca ```
This commit is contained in:
parent
2069210002
commit
bb68c20d99
4 changed files with 103 additions and 21 deletions
|
@ -1647,7 +1647,13 @@ describe('Execution Handler', () => {
|
||||||
"val": "rule url: http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
"val": "rule url: http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
},
|
},
|
||||||
"actionTypeId": "test",
|
"actionTypeId": "test",
|
||||||
"ruleUrl": "http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
"ruleUrl": Object {
|
||||||
|
"absoluteUrl": "http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"basePathname": "",
|
||||||
|
"kibanaBaseUrl": "http://localhost:12345",
|
||||||
|
"relativePath": "/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"spaceIdSegment": "/s/test1",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
|
@ -1699,7 +1705,7 @@ describe('Execution Handler', () => {
|
||||||
rule: summaryRuleWithUrl,
|
rule: summaryRuleWithUrl,
|
||||||
taskRunnerContext: {
|
taskRunnerContext: {
|
||||||
...defaultExecutionParams.taskRunnerContext,
|
...defaultExecutionParams.taskRunnerContext,
|
||||||
kibanaBaseUrl: 'http://localhost:12345',
|
kibanaBaseUrl: 'http://localhost:12345/basePath',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1710,10 +1716,16 @@ describe('Execution Handler', () => {
|
||||||
Array [
|
Array [
|
||||||
Object {
|
Object {
|
||||||
"actionParams": Object {
|
"actionParams": Object {
|
||||||
"val": "rule url: http://localhost:12345/s/test1/app/test/rule/1?start=30000&end=90000",
|
"val": "rule url: http://localhost:12345/basePath/s/test1/app/test/rule/1?start=30000&end=90000",
|
||||||
},
|
},
|
||||||
"actionTypeId": "test",
|
"actionTypeId": "test",
|
||||||
"ruleUrl": "http://localhost:12345/s/test1/app/test/rule/1?start=30000&end=90000",
|
"ruleUrl": Object {
|
||||||
|
"absoluteUrl": "http://localhost:12345/basePath/s/test1/app/test/rule/1?start=30000&end=90000",
|
||||||
|
"basePathname": "/basePath",
|
||||||
|
"kibanaBaseUrl": "http://localhost:12345/basePath",
|
||||||
|
"relativePath": "/app/test/rule/1?start=30000&end=90000",
|
||||||
|
"spaceIdSegment": "/s/test1",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
|
@ -1742,7 +1754,13 @@ describe('Execution Handler', () => {
|
||||||
"val": "rule url: http://localhost:12345/app/management/insightsAndAlerting/triggersActions/rule/1",
|
"val": "rule url: http://localhost:12345/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
},
|
},
|
||||||
"actionTypeId": "test",
|
"actionTypeId": "test",
|
||||||
"ruleUrl": "http://localhost:12345/app/management/insightsAndAlerting/triggersActions/rule/1",
|
"ruleUrl": Object {
|
||||||
|
"absoluteUrl": "http://localhost:12345/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"basePathname": "",
|
||||||
|
"kibanaBaseUrl": "http://localhost:12345",
|
||||||
|
"relativePath": "/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"spaceIdSegment": "",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
|
@ -1768,7 +1786,13 @@ describe('Execution Handler', () => {
|
||||||
"val": "rule url: http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
"val": "rule url: http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
},
|
},
|
||||||
"actionTypeId": "test",
|
"actionTypeId": "test",
|
||||||
"ruleUrl": "http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
"ruleUrl": Object {
|
||||||
|
"absoluteUrl": "http://localhost:12345/s/test1/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"basePathname": "",
|
||||||
|
"kibanaBaseUrl": "http://localhost:12345/",
|
||||||
|
"relativePath": "/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"spaceIdSegment": "/s/test1",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
|
@ -1884,7 +1908,13 @@ describe('Execution Handler', () => {
|
||||||
"val": "rule url: http://localhost:12345/s/test1/app/management/some/other/place",
|
"val": "rule url: http://localhost:12345/s/test1/app/management/some/other/place",
|
||||||
},
|
},
|
||||||
"actionTypeId": "test",
|
"actionTypeId": "test",
|
||||||
"ruleUrl": "http://localhost:12345/s/test1/app/management/some/other/place",
|
"ruleUrl": Object {
|
||||||
|
"absoluteUrl": "http://localhost:12345/s/test1/app/management/some/other/place",
|
||||||
|
"basePathname": "",
|
||||||
|
"kibanaBaseUrl": "http://localhost:12345",
|
||||||
|
"relativePath": "/app/management/some/other/place",
|
||||||
|
"spaceIdSegment": "/s/test1",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
|
|
|
@ -53,6 +53,14 @@ export interface RunResult {
|
||||||
throttledSummaryActions: ThrottledActions;
|
throttledSummaryActions: ThrottledActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface RuleUrl {
|
||||||
|
absoluteUrl?: string;
|
||||||
|
kibanaBaseUrl?: string;
|
||||||
|
basePathname?: string;
|
||||||
|
spaceIdSegment?: string;
|
||||||
|
relativePath?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export class ExecutionHandler<
|
export class ExecutionHandler<
|
||||||
Params extends RuleTypeParams,
|
Params extends RuleTypeParams,
|
||||||
ExtractedParams extends RuleTypeParams,
|
ExtractedParams extends RuleTypeParams,
|
||||||
|
@ -240,7 +248,7 @@ export class ExecutionHandler<
|
||||||
actionsPlugin,
|
actionsPlugin,
|
||||||
actionTypeId,
|
actionTypeId,
|
||||||
kibanaBaseUrl: this.taskRunnerContext.kibanaBaseUrl,
|
kibanaBaseUrl: this.taskRunnerContext.kibanaBaseUrl,
|
||||||
ruleUrl,
|
ruleUrl: ruleUrl?.absoluteUrl,
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
@ -289,7 +297,7 @@ export class ExecutionHandler<
|
||||||
alertParams: this.rule.params,
|
alertParams: this.rule.params,
|
||||||
actionParams: action.params,
|
actionParams: action.params,
|
||||||
flapping: alert.getFlapping(),
|
flapping: alert.getFlapping(),
|
||||||
ruleUrl,
|
ruleUrl: ruleUrl?.absoluteUrl,
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
@ -437,7 +445,7 @@ export class ExecutionHandler<
|
||||||
return alert.getScheduledActionOptions()?.actionGroup || this.ruleType.recoveryActionGroup.id;
|
return alert.getScheduledActionOptions()?.actionGroup || this.ruleType.recoveryActionGroup.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
private buildRuleUrl(spaceId: string, start?: number, end?: number): string | undefined {
|
private buildRuleUrl(spaceId: string, start?: number, end?: number): RuleUrl | undefined {
|
||||||
if (!this.taskRunnerContext.kibanaBaseUrl) {
|
if (!this.taskRunnerContext.kibanaBaseUrl) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -456,7 +464,13 @@ export class ExecutionHandler<
|
||||||
this.taskRunnerContext.kibanaBaseUrl
|
this.taskRunnerContext.kibanaBaseUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
return ruleUrl.toString();
|
return {
|
||||||
|
absoluteUrl: ruleUrl.toString(),
|
||||||
|
kibanaBaseUrl: this.taskRunnerContext.kibanaBaseUrl,
|
||||||
|
basePathname: basePathnamePrefix,
|
||||||
|
spaceIdSegment,
|
||||||
|
relativePath,
|
||||||
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.debug(
|
this.logger.debug(
|
||||||
`Rule "${this.rule.id}" encountered an error while constructing the rule.url variable: ${error.message}`
|
`Rule "${this.rule.id}" encountered an error while constructing the rule.url variable: ${error.message}`
|
||||||
|
|
|
@ -23,16 +23,24 @@ describe('injectActionParams', () => {
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('injects viewInKibanaPath and viewInKibanaText when actionTypeId is .email', () => {
|
test('injects viewInKibanaPath and viewInKibanaText when actionTypeId is .email and there is no basePathname', () => {
|
||||||
const actionParams = {
|
const actionParams = {
|
||||||
body: {
|
body: {
|
||||||
message: 'State: "{{state.value}}", Context: "{{context.value}}"',
|
message: 'State: "{{state.value}}", Context: "{{context.value}}"',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
const ruleUrl = {
|
||||||
|
absoluteUrl:
|
||||||
|
'http://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/1',
|
||||||
|
kibanaBaseUrl: 'http://localhost:5601',
|
||||||
|
basePathname: '',
|
||||||
|
spaceIdSegment: '',
|
||||||
|
relativePath: '/app/management/insightsAndAlerting/triggersActions/rule/1',
|
||||||
|
};
|
||||||
const result = injectActionParams({
|
const result = injectActionParams({
|
||||||
actionParams,
|
actionParams,
|
||||||
actionTypeId: '.email',
|
actionTypeId: '.email',
|
||||||
ruleUrl: 'http://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/1',
|
ruleUrl,
|
||||||
});
|
});
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
Object {
|
Object {
|
||||||
|
@ -47,6 +55,39 @@ describe('injectActionParams', () => {
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('injects viewInKibanaPath and viewInKibanaText when actionTypeId is .email with basePathname and spaceId', () => {
|
||||||
|
const actionParams = {
|
||||||
|
body: {
|
||||||
|
message: 'State: "{{state.value}}", Context: "{{context.value}}"',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const ruleUrl = {
|
||||||
|
absoluteUrl:
|
||||||
|
'http://localhost:5601/kibana/s/mary/app/management/insightsAndAlerting/triggersActions/rule/1',
|
||||||
|
kibanaBaseUrl: 'http://localhost:5601/kibana',
|
||||||
|
basePathname: '/kibana',
|
||||||
|
spaceIdSegment: '/s/mary',
|
||||||
|
relativePath: '/app/management/insightsAndAlerting/triggersActions/rule/1',
|
||||||
|
};
|
||||||
|
const result = injectActionParams({
|
||||||
|
actionParams,
|
||||||
|
actionTypeId: '.email',
|
||||||
|
ruleUrl,
|
||||||
|
});
|
||||||
|
// path in the snapshot should not include /kibana since it is part of kibanaBaseUrl already
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
Object {
|
||||||
|
"body": Object {
|
||||||
|
"message": "State: \\"{{state.value}}\\", Context: \\"{{context.value}}\\"",
|
||||||
|
},
|
||||||
|
"kibanaFooterLink": Object {
|
||||||
|
"path": "/s/mary/app/management/insightsAndAlerting/triggersActions/rule/1",
|
||||||
|
"text": "View rule in Kibana",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
test('injects viewInKibanaPath as empty string when the ruleUrl is undefined', () => {
|
test('injects viewInKibanaPath as empty string when the ruleUrl is undefined', () => {
|
||||||
const actionParams = {
|
const actionParams = {
|
||||||
body: {
|
body: {
|
||||||
|
|
|
@ -7,27 +7,24 @@
|
||||||
|
|
||||||
import { i18n } from '@kbn/i18n';
|
import { i18n } from '@kbn/i18n';
|
||||||
import { RuleActionParams } from '../types';
|
import { RuleActionParams } from '../types';
|
||||||
|
import { RuleUrl } from './execution_handler';
|
||||||
|
|
||||||
export interface InjectActionParamsOpts {
|
export interface InjectActionParamsOpts {
|
||||||
actionTypeId: string;
|
actionTypeId: string;
|
||||||
actionParams: RuleActionParams;
|
actionParams: RuleActionParams;
|
||||||
ruleUrl?: string;
|
ruleUrl?: RuleUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function injectActionParams({
|
export function injectActionParams({
|
||||||
actionTypeId,
|
actionTypeId,
|
||||||
actionParams,
|
actionParams,
|
||||||
ruleUrl = '',
|
ruleUrl = {},
|
||||||
}: InjectActionParamsOpts) {
|
}: InjectActionParamsOpts) {
|
||||||
// Inject kibanaFooterLink if action type is email. This is used by the email action type
|
// Inject kibanaFooterLink if action type is email. This is used by the email action type
|
||||||
// to inject a "View alert in Kibana" with a URL in the email's footer.
|
// to inject a "View alert in Kibana" with a URL in the email's footer.
|
||||||
if (actionTypeId === '.email') {
|
if (actionTypeId === '.email') {
|
||||||
let path;
|
// path should not include basePathname since it is part of kibanaBaseUrl already
|
||||||
try {
|
const path = [ruleUrl.spaceIdSegment ?? '', ruleUrl.relativePath ?? ''].join('');
|
||||||
path = new URL(ruleUrl).pathname;
|
|
||||||
} catch (e) {
|
|
||||||
path = '';
|
|
||||||
}
|
|
||||||
return {
|
return {
|
||||||
...actionParams,
|
...actionParams,
|
||||||
kibanaFooterLink: {
|
kibanaFooterLink: {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue