[Alerts] Jira: Disallow labels with spaces (#90548)

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Christos Nasikas 2021-02-08 23:42:07 +02:00 committed by GitHub
parent 7a2b7550c9
commit 46feb76592
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 78 additions and 3 deletions

View file

@ -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)`

View file

@ -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(

View file

@ -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.'],
},
});
});

View file

@ -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')),

View file

@ -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>

View file

@ -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.',
}
);

View file

@ -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', () => {