mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
[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:
parent
ff64557c8f
commit
ccdd662a05
3 changed files with 36 additions and 1 deletions
|
@ -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: [
|
||||
|
|
|
@ -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');
|
||||
});
|
|
@ -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(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue