From 8eed97b69fa71e096c04a01ae1b26efa641fec85 Mon Sep 17 00:00:00 2001 From: Matt Bargar Date: Mon, 12 Dec 2016 16:32:22 -0500 Subject: [PATCH] Limit scripted fields to painless and expression langs (#9172) We made a mistake in opening up Kibana scripted fields to any and all langs enabled in Elasticsearch. Kibana needs to do some magic to get certain scripted field features to work (https://github.com/elastic/kibana/pull/9171) and we can't commit to supporting anything beyond expression and painless scripts. On top of that, the other languages are being removed in ES 6.0 anyway. This commit makes that stance explicit by disallowing anything other than those two choices. --- docs/migration/migrate_6_0.asciidoc | 11 ++++++++++- src/ui/public/field_editor/field_editor.js | 12 ++++++------ src/ui/public/scripting_languages/index.js | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/ui/public/scripting_languages/index.js diff --git a/docs/migration/migrate_6_0.asciidoc b/docs/migration/migrate_6_0.asciidoc index cf481ba78d68..27830c6f806f 100644 --- a/docs/migration/migrate_6_0.asciidoc +++ b/docs/migration/migrate_6_0.asciidoc @@ -1,4 +1,13 @@ [[breaking-changes-6.0]] == Breaking changes in 6.0 -There are not yet any breaking changes in Kibana 6.0 +This section discusses the changes that you need to be aware of when migrating +your application to Kibana 6.0. + +[float] +=== Removed option to use unsupported scripting languages +*Details:* Kibana 5.x allowed users to create scripted fields using any scripting language enabled in Elasticsearch. +Kibana 6.0 will only support Painless and Lucene expression based scripts. + + +*Impact:* You will need to migrate your groovy, python, javascript, etc. scripted fields to Painless or Lucene expressions. \ No newline at end of file diff --git a/src/ui/public/field_editor/field_editor.js b/src/ui/public/field_editor/field_editor.js index ed66858deaf5..ffa5dfca5d16 100644 --- a/src/ui/public/field_editor/field_editor.js +++ b/src/ui/public/field_editor/field_editor.js @@ -10,12 +10,14 @@ import chrome from 'ui/chrome'; import IndexPatternsCastMappingTypeProvider from 'ui/index_patterns/_cast_mapping_type'; import { scriptedFields as docLinks } from '../documentation_links/documentation_links'; import './field_editor.less'; +import { GetEnabledScriptingLanguagesProvider, getSupportedScriptingLanguages } from '../scripting_languages'; uiModules .get('kibana', ['colorpicker.module']) .directive('fieldEditor', function (Private, $sce) { let fieldFormats = Private(RegistryFieldFormatsProvider); let Field = Private(IndexPatternsFieldProvider); + let getEnabledScriptingLanguages = Private(GetEnabledScriptingLanguagesProvider); const fieldTypesByLang = { painless: ['number', 'string', 'date', 'boolean'], @@ -37,7 +39,7 @@ uiModules self.docLinks = docLinks; getScriptingLangs().then((langs) => { - self.scriptingLangs = langs; + self.scriptingLangs = _.intersection(langs, ['expression', 'painless']); if (!_.includes(self.scriptingLangs, self.field.lang)) { self.field.lang = undefined; } @@ -159,11 +161,9 @@ uiModules } function getScriptingLangs() { - return $http.get(chrome.addBasePath('/api/kibana/scripts/languages')) - .then((res) => res.data) - .catch(() => { - notify.error('Error getting available scripting languages from Elasticsearch'); - return []; + return getEnabledScriptingLanguages() + .then((enabledLanguages) => { + return _.intersection(enabledLanguages, getSupportedScriptingLanguages()); }); } diff --git a/src/ui/public/scripting_languages/index.js b/src/ui/public/scripting_languages/index.js new file mode 100644 index 000000000000..9a26119cb3df --- /dev/null +++ b/src/ui/public/scripting_languages/index.js @@ -0,0 +1,20 @@ +import chrome from 'ui/chrome'; +import Notifier from 'ui/notify/notifier'; +import { intersection } from 'lodash'; + +const notify = new Notifier({ location: 'Scripting Language Service' }); + +export function getSupportedScriptingLanguages() { + return ['expression', 'painless']; +} + +export function GetEnabledScriptingLanguagesProvider($http) { + return () => { + return $http.get(chrome.addBasePath('/api/kibana/scripts/languages')) + .then((res) => res.data) + .catch(() => { + notify.error('Error getting available scripting languages from Elasticsearch'); + return []; + }); + }; +}