Skip to content

Commit

Permalink
[Response Ops][Task Manager] Changing task manager `schedule.interval…
Browse files Browse the repository at this point in the history
…` 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:
#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.
  • Loading branch information
ymao1 authored Dec 17, 2024
1 parent ff64557 commit ccdd662
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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: [
Expand Down
Original file line number Diff line number Diff line change
@@ -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');
});
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -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(),
Expand Down

0 comments on commit ccdd662

Please sign in to comment.