[Response Ops][Task Manager] Changing task manager schedule.interval schema to string from duration (#204413)

## Summary

Currently, when task manager schema changes are migrated down (which can
occur during a release when there are multiple Kibana nodes running and
they get updated one after another), we are running into this bug:
https://github.com/elastic/kibana/issues/204395 where the task
`schedule.interval` gets mutated from expected values (like `60s`) to
unallowed (but still valid for the schema) values (like `PT1M`).

This changes the schema for `schedule.interval` to use a string with
validation function.

## To verify
1. Run Kibana on `main` and create some rules that run frequently.
2. "Upgrade" to this PR branch and verify that rules continue to run.
3. "Downgrade" back to `main` and verify that rules continue to run.
This commit is contained in:
Ying Mao 2024-12-17 17:41:20 -05:00 committed by GitHub
parent ff64557c8f
commit ccdd662a05
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 36 additions and 1 deletions

View file

@ -8,6 +8,10 @@
import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server';
import { taskSchemaV1, taskSchemaV2 } from '../schemas/task';
// IMPORTANT!!!
// When adding new model versions, make sure to manually test
// downgrading to the previous version. This is a gap in our
// automated test coverage so manual testing is needed.
export const taskModelVersions: SavedObjectsModelVersionMap = {
'1': {
changes: [

View file

@ -0,0 +1,24 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { validateDuration } from './task';
test('allows valid duration', () => {
expect(validateDuration('1s')).toBeUndefined();
expect(validateDuration('45346s')).toBeUndefined();
expect(validateDuration('10m')).toBeUndefined();
expect(validateDuration('30000000h')).toBeUndefined();
expect(validateDuration('3245d')).toBeUndefined();
});
test('returns error message for invalid duration', () => {
expect(validateDuration('10x')).toBe('string is not a valid duration: 10x');
expect(validateDuration('PT1M')).toBe('string is not a valid duration: PT1M');
expect(validateDuration('foo')).toBe('string is not a valid duration: foo');
expect(validateDuration('1 minute')).toBe('string is not a valid duration: 1 minute');
expect(validateDuration('1hr')).toBe('string is not a valid duration: 1hr');
});

View file

@ -6,6 +6,13 @@
*/
import { schema } from '@kbn/config-schema';
import { isInterval } from '../../lib/intervals';
export function validateDuration(duration: string) {
if (!isInterval(duration)) {
return 'string is not a valid duration: ' + duration;
}
}
export const taskSchemaV1 = schema.object({
taskType: schema.string(),
@ -15,7 +22,7 @@ export const taskSchemaV1 = schema.object({
runAt: schema.string(),
schedule: schema.maybe(
schema.object({
interval: schema.duration(),
interval: schema.string({ validate: validateDuration }),
})
),
params: schema.string(),