mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
[Alerts] Jira: Disallow labels with spaces (#90548)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
7a2b7550c9
commit
46feb76592
7 changed files with 78 additions and 3 deletions
|
@ -657,7 +657,7 @@ The following table describes the properties of the `incident` object.
|
|||
| externalId | The id of the issue in Jira. If presented the incident will be update. Otherwise a new incident will be created. | string _(optional)_ |
|
||||
| issueType | The id of the issue type in Jira. | string _(optional)_ |
|
||||
| priority | The name of the priority in Jira. Example: `Medium`. | string _(optional)_ |
|
||||
| labels | An array of labels. | string[] _(optional)_ |
|
||||
| labels | An array of labels. Labels cannot contain spaces. | string[] _(optional)_ |
|
||||
| parent | The parent issue id or key. Only for `Sub-task` issue types. | string _(optional)_ |
|
||||
|
||||
#### `subActionParams (getIncident)`
|
||||
|
|
|
@ -40,7 +40,15 @@ export const ExecutorSubActionPushParamsSchema = schema.object({
|
|||
externalId: schema.nullable(schema.string()),
|
||||
issueType: schema.nullable(schema.string()),
|
||||
priority: schema.nullable(schema.string()),
|
||||
labels: schema.nullable(schema.arrayOf(schema.string())),
|
||||
labels: schema.nullable(
|
||||
schema.arrayOf(
|
||||
schema.string({
|
||||
validate: (label) =>
|
||||
// Matches any space, tab or newline character.
|
||||
label.match(/\s/g) ? `The label ${label} cannot contain spaces` : undefined,
|
||||
})
|
||||
)
|
||||
),
|
||||
parent: schema.nullable(schema.string()),
|
||||
}),
|
||||
comments: schema.nullable(
|
||||
|
|
|
@ -96,7 +96,7 @@ describe('jira action params validation', () => {
|
|||
};
|
||||
|
||||
expect(actionTypeModel.validateParams(actionParams)).toEqual({
|
||||
errors: { 'subActionParams.incident.summary': [] },
|
||||
errors: { 'subActionParams.incident.summary': [], 'subActionParams.incident.labels': [] },
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -108,6 +108,23 @@ describe('jira action params validation', () => {
|
|||
expect(actionTypeModel.validateParams(actionParams)).toEqual({
|
||||
errors: {
|
||||
'subActionParams.incident.summary': ['Summary is required.'],
|
||||
'subActionParams.incident.labels': [],
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test('params validation fails when labels contain spaces', () => {
|
||||
const actionParams = {
|
||||
subActionParams: {
|
||||
incident: { summary: 'some title', labels: ['label with spaces'] },
|
||||
comments: [],
|
||||
},
|
||||
};
|
||||
|
||||
expect(actionTypeModel.validateParams(actionParams)).toEqual({
|
||||
errors: {
|
||||
'subActionParams.incident.summary': [],
|
||||
'subActionParams.incident.labels': ['Labels cannot contain spaces.'],
|
||||
},
|
||||
});
|
||||
});
|
||||
|
|
|
@ -72,6 +72,7 @@ export function getActionType(): ActionTypeModel<JiraConfig, JiraSecrets, JiraAc
|
|||
validateParams: (actionParams: JiraActionParams): GenericValidationResult<unknown> => {
|
||||
const errors = {
|
||||
'subActionParams.incident.summary': new Array<string>(),
|
||||
'subActionParams.incident.labels': new Array<string>(),
|
||||
};
|
||||
const validationResult = {
|
||||
errors,
|
||||
|
@ -83,6 +84,12 @@ export function getActionType(): ActionTypeModel<JiraConfig, JiraSecrets, JiraAc
|
|||
) {
|
||||
errors['subActionParams.incident.summary'].push(i18n.SUMMARY_REQUIRED);
|
||||
}
|
||||
|
||||
if (actionParams.subActionParams?.incident?.labels?.length) {
|
||||
// Jira do not allows empty spaces on labels. If the label includes a whitespace show an error.
|
||||
if (actionParams.subActionParams.incident.labels.some((label) => label.match(/\s/g)))
|
||||
errors['subActionParams.incident.labels'].push(i18n.LABELS_WHITE_SPACES);
|
||||
}
|
||||
return validationResult;
|
||||
},
|
||||
actionParamsFields: lazy(() => import('./jira_params')),
|
||||
|
|
|
@ -184,6 +184,11 @@ const JiraParamsFields: React.FunctionComponent<ActionParamsProps<JiraActionPara
|
|||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [actionParams]);
|
||||
|
||||
const areLabelsInvalid =
|
||||
errors['subActionParams.incident.labels'] != null &&
|
||||
errors['subActionParams.incident.labels'].length > 0 &&
|
||||
incident.labels !== undefined;
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<>
|
||||
|
@ -304,6 +309,8 @@ const JiraParamsFields: React.FunctionComponent<ActionParamsProps<JiraActionPara
|
|||
defaultMessage: 'Labels',
|
||||
}
|
||||
)}
|
||||
error={errors['subActionParams.incident.labels'] as string[]}
|
||||
isInvalid={areLabelsInvalid}
|
||||
>
|
||||
<EuiComboBox
|
||||
noSuggestions
|
||||
|
@ -331,6 +338,7 @@ const JiraParamsFields: React.FunctionComponent<ActionParamsProps<JiraActionPara
|
|||
}}
|
||||
isClearable={true}
|
||||
data-test-subj="labelsComboBox"
|
||||
isInvalid={areLabelsInvalid}
|
||||
/>
|
||||
</EuiFormRow>
|
||||
</EuiFlexItem>
|
||||
|
|
|
@ -199,3 +199,10 @@ export const SEARCH_ISSUES_LOADING = i18n.translate(
|
|||
defaultMessage: 'Loading...',
|
||||
}
|
||||
);
|
||||
|
||||
export const LABELS_WHITE_SPACES = i18n.translate(
|
||||
'xpack.triggersActionsUI.components.builtinActionTypes.jira.labelsSpacesErrorMessage',
|
||||
{
|
||||
defaultMessage: 'Labels cannot contain spaces.',
|
||||
}
|
||||
);
|
||||
|
|
|
@ -375,6 +375,34 @@ export default function jiraTest({ getService }: FtrProviderContext) {
|
|||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle failing with a simulated success when labels containing a space', async () => {
|
||||
await supertest
|
||||
.post(`/api/actions/action/${simulatedActionId}/_execute`)
|
||||
.set('kbn-xsrf', 'foo')
|
||||
.send({
|
||||
params: {
|
||||
...mockJira.params,
|
||||
subActionParams: {
|
||||
incident: {
|
||||
...mockJira.params.subActionParams.incident,
|
||||
issueType: '10006',
|
||||
labels: ['label with spaces'],
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
},
|
||||
})
|
||||
.then((resp: any) => {
|
||||
expect(resp.body).to.eql({
|
||||
actionId: simulatedActionId,
|
||||
status: 'error',
|
||||
retry: false,
|
||||
message:
|
||||
'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.labels]: types that failed validation:\n - [subActionParams.incident.labels.0.0]: The label label with spaces cannot contain spaces\n - [subActionParams.incident.labels.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]',
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Execution', () => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue