diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/directives/pipeline_setup.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/directives/pipeline_setup.js index 667849fa7aa50c..813be624664c5f 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/directives/pipeline_setup.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/directives/pipeline_setup.js @@ -10,25 +10,10 @@ import './source_data'; import './processor_ui_container'; import '../processors'; import pipelineSetupTemplate from '../views/pipeline_setup.html'; +import buildProcessorTypeArray from '../lib/build_processor_type_array'; const app = uiModules.get('kibana'); -function buildProcessorTypeList(enabledProcessorTypeIds) { - return _(ProcessorTypes) - .map(Type => { - const instance = new Type(); - return { - typeId: instance.typeId, - title: instance.title, - Type - }; - }) - .compact() - .filter((processorType) => enabledProcessorTypeIds.includes(processorType.typeId)) - .sortBy('title') - .value(); -} - app.directive('pipelineSetup', function () { return { restrict: 'E', @@ -45,7 +30,10 @@ app.directive('pipelineSetup', function () { //determines which processors are available on the cluster ingest.getProcessors() .then((enabledProcessorTypeIds) => { - $scope.processorTypes = buildProcessorTypeList(enabledProcessorTypeIds); + $scope.processorTypes = _(buildProcessorTypeArray(ProcessorTypes)) + .filter((processorType) => enabledProcessorTypeIds.includes(processorType.typeId)) + .sortBy('title') + .value(); }) .catch(notify.error); diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/build_processor_type_array.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/build_processor_type_array.js new file mode 100644 index 00000000000000..645e6107da0d79 --- /dev/null +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/build_processor_type_array.js @@ -0,0 +1,15 @@ +import _ from 'lodash'; + +export default function buildProcessorTypeArray(Types) { + return _(Types) + .map(Type => { + const instance = new Type(); + return { + typeId: instance.typeId, + title: instance.title, + Type + }; + }) + .compact() + .value(); +} diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/pipeline.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/pipeline.js index 17f562e677ade7..75682e1567c616 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/pipeline.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/lib/pipeline.js @@ -109,20 +109,19 @@ export default class Pipeline { processors[index] = temp; } - addExisting(existingProcessor) { - const Type = existingProcessor.constructor; - const newProcessor = this.add(Type); - _.assign(newProcessor, _.omit(existingProcessor, 'processorId')); + addExisting(oldProcessor) { + const Type = oldProcessor.constructor; + const newProcessor = this.add(Type, oldProcessor); return newProcessor; } - add(ProcessorType) { + add(ProcessorType, oldProcessor) { const processors = this.processors; this.processorCounter += 1; const processorId = `processor_${this.processorCounter}`; - const newProcessor = new ProcessorType(processorId); + const newProcessor = new ProcessorType(processorId, oldProcessor); processors.push(newProcessor); return newProcessor; diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/append/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/append/view_model.js index a0a9711367a429..0b708747989b07 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/append/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/append/view_model.js @@ -1,10 +1,15 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Append extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'append', 'Append'); - this.targetField = ''; - this.values = []; + _.assign(this, + { + targetField: '', + values: [] + }, + _.pick(oldProcessor, ['targetField', 'values'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/convert/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/convert/view_model.js index ada158dc34454f..f713b0e6041dc2 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/convert/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/convert/view_model.js @@ -2,11 +2,15 @@ import _ from 'lodash'; import Processor from '../base/view_model'; export class Convert extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'convert', 'Convert'); - this.sourceField = ''; - this.targetField = ''; - this.type = 'auto'; + _.assign(this, + { + sourceField: '', + targetField: '', + type: 'auto' + }, + _.pick(oldProcessor, ['sourceField', 'targetField', 'type'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/date/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/date/view_model.js index 0186675e3e2295..ef66eeb6937f56 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/date/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/date/view_model.js @@ -1,14 +1,19 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Date extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'date', 'Date'); - this.sourceField = ''; - this.targetField = '@timestamp'; - this.formats = []; - this.timezone = 'Etc/UTC'; - this.locale = 'ENGLISH'; - this.customFormat = ''; + _.assign(this, + { + sourceField: '', + targetField: '@timestamp', + formats: [], + timezone: 'Etc/UTC', + locale: 'ENGLISH', + customFormat: '' + }, + _.pick(oldProcessor, ['sourceField', 'targetField', 'formats', 'timezone', 'locale', 'customFormat'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/geoip/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/geoip/view_model.js index 7041b92cb4a44d..2fb87493e85676 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/geoip/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/geoip/view_model.js @@ -1,12 +1,17 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class GeoIp extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'geoip', 'Geo IP'); - this.sourceField = ''; - this.targetField = ''; - this.databaseFile = ''; - this.databaseFields = []; + _.assign(this, + { + sourceField: '', + targetField: '', + databaseFile: '', + databaseFields: [] + }, + _.pick(oldProcessor, ['sourceField', 'targetField', 'databaseFile', 'databaseFields'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/grok/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/grok/view_model.js index 548b2d52f2a2ff..3866f953ebf24b 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/grok/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/grok/view_model.js @@ -3,10 +3,14 @@ import keysDeep from '../../lib/keys_deep'; import Processor from '../base/view_model'; export class Grok extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'grok', 'Grok'); - this.sourceField = ''; - this.pattern = ''; + _.assign(this, + { + sourceField: '', + pattern: '' + }, + _.pick(oldProcessor, ['sourceField', 'pattern'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/gsub/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/gsub/view_model.js index 32559f9d8ea59b..aecd6355190d75 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/gsub/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/gsub/view_model.js @@ -1,11 +1,16 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Gsub extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'gsub', 'Gsub'); - this.sourceField = ''; - this.pattern = ''; - this.replacement = ''; + _.assign(this, + { + sourceField: '', + pattern: '', + replacement: '' + }, + _.pick(oldProcessor, ['sourceField', 'pattern', 'replacement'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/join/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/join/view_model.js index a480b749d8680d..1e4fa3e3bf942f 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/join/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/join/view_model.js @@ -1,10 +1,15 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Join extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'join', 'Join'); - this.sourceField = ''; - this.separator = ''; + _.assign(this, + { + sourceField: '', + separator: '' + }, + _.pick(oldProcessor, ['sourceField', 'separator'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/lowercase/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/lowercase/view_model.js index 4cc12cd0437df8..8beebfba3381b5 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/lowercase/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/lowercase/view_model.js @@ -1,9 +1,14 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Lowercase extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'lowercase', 'Lowercase'); - this.sourceField = ''; + _.assign(this, + { + sourceField: '' + }, + _.pick(oldProcessor, ['sourceField'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/remove/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/remove/view_model.js index fb33cfc5e4cef7..aa236f7b559ed9 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/remove/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/remove/view_model.js @@ -1,9 +1,14 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Remove extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'remove', 'Remove'); - this.sourceField = ''; + _.assign(this, + { + sourceField: '' + }, + _.pick(oldProcessor, ['sourceField'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/rename/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/rename/view_model.js index 1899fcfc3c2a9b..a511eaf3381543 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/rename/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/rename/view_model.js @@ -1,10 +1,15 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Rename extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'rename', 'Rename'); - this.sourceField = ''; - this.targetField = ''; + _.assign(this, + { + sourceField: '', + targetField: '' + }, + _.pick(oldProcessor, ['sourceField', 'targetField'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/set/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/set/view_model.js index 4c7f31352c2d9a..48e87ecef35191 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/set/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/set/view_model.js @@ -1,10 +1,15 @@ import Processor from '../base/view_model'; +import _ from 'lodash'; export class Set extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'set', 'Set'); - this.targetField = ''; - this.value = ''; + _.assign(this, + { + targetField: '', + value: '' + }, + _.pick(oldProcessor, ['targetField', 'value'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/split/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/split/view_model.js index 30e7c8d81473c8..1800cab5454cc8 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/split/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/split/view_model.js @@ -1,10 +1,15 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Split extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'split', 'Split'); - this.sourceField = ''; - this.separator = ''; + _.assign(this, + { + sourceField: '', + separator: '' + }, + _.pick(oldProcessor, ['sourceField', 'separator'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/trim/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/trim/view_model.js index c0a52f2a899fcf..4e125a1472fc16 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/trim/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/trim/view_model.js @@ -1,9 +1,14 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Trim extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'trim', 'Trim'); - this.sourceField = ''; + _.assign(this, + { + sourceField: '' + }, + _.pick(oldProcessor, ['sourceField'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/uppercase/view_model.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/uppercase/view_model.js index ce831ab40028cd..76db9c4f3cb548 100644 --- a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/uppercase/view_model.js +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/pipeline_setup/processors/uppercase/view_model.js @@ -1,9 +1,14 @@ +import _ from 'lodash'; import Processor from '../base/view_model'; export class Uppercase extends Processor { - constructor(processorId) { + constructor(processorId, oldProcessor) { super(processorId, 'uppercase', 'Uppercase'); - this.sourceField = ''; + _.assign(this, + { + sourceField: '' + }, + _.pick(oldProcessor, ['sourceField'])); } get description() { diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/select_pipeline.html b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/select_pipeline.html new file mode 100644 index 00000000000000..dedf0171e11221 --- /dev/null +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/select_pipeline.html @@ -0,0 +1,10 @@ +

New or Existing? +Do you want to create a new pipeline, or edit an existing pipline? +

+ + diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/select_pipeline.js b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/select_pipeline.js new file mode 100644 index 00000000000000..75152d1d1d1971 --- /dev/null +++ b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/select_pipeline.js @@ -0,0 +1,56 @@ +import modules from 'ui/modules'; +import template from './select_pipeline.html'; +import _ from 'lodash'; +import IngestProvider from 'ui/ingest'; +import * as ProcessorTypes from '../../add_data_steps/pipeline_setup/processors/view_models'; +import './styles/styles.less'; +import buildProcessorTypeArray from '../pipeline_setup/lib/build_processor_type_array'; + +modules.get('apps/settings') + .directive('selectPipeline', function () { + return { + template: template, + scope: { + pipeline: '=' + }, + bindToController: true, + controllerAs: 'selectPipeline', + controller: function ($scope, Private, Notifier) { + const ingest = Private(IngestProvider); + const notify = new Notifier({ location: `Select Pipeline` }); + const processorTypes = buildProcessorTypeArray(ProcessorTypes); + + ingest.getPipelines() + .then((pipelines) => { + this.pipelines = pipelines; + }) + .catch(notify.error); + + $scope.$watch('selectPipeline.pipelineName', (newValue) => { + if (newValue) { + delete this.pipeline; + + ingest.getPipeline(newValue) + .then((result) => { + const pipeline = { + processors: [] + }; + + _.forEach(result.processors, (esProcessor) => { + const Type = _.find(processorTypes, { typeId: esProcessor.typeId }).Type; + const processor = new Type('', esProcessor); + processor.collapsed = true; + pipeline.processors.push(processor); + }); + + this.pipeline = pipeline; + }) + .catch(notify.error); + } else { + this.pipeline = { processors: [] }; + } + }); + } + }; + }); + diff --git a/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/styles/styles.less b/src/plugins/kibana/public/settings/sections/indices/add_data_steps/select_pipeline/styles/styles.less new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.html b/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.html index b1a219a0ef4bc2..c3ca321fba4eb6 100644 --- a/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.html +++ b/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.html @@ -3,34 +3,39 @@ - 1. Paste + 1. New/Edit - 2. Parse + ng-click="wizard.setCurrentStep(1)"> + 2. Paste - 3. Review + 3. Parse - 4. Install Filebeat + 4. Review + + + 5. Install Filebeat
- +
@@ -40,6 +45,28 @@
+ +
+
+ +
+
+ +
+
+
+
+ +
@@ -64,7 +91,7 @@
-
+
-
+
diff --git a/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.js b/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.js index 6de8287171bfff..91b4a8ec755017 100644 --- a/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.js +++ b/src/plugins/kibana/public/settings/sections/indices/filebeat/directives/filebeat_wizard.js @@ -4,6 +4,7 @@ import IngestProvider from 'ui/ingest'; import 'plugins/kibana/settings/sections/indices/add_data_steps/pattern_review_step'; import 'plugins/kibana/settings/sections/indices/add_data_steps/paste_samples_step'; import 'plugins/kibana/settings/sections/indices/add_data_steps/pipeline_setup'; +import 'plugins/kibana/settings/sections/indices/add_data_steps/select_pipeline'; import 'plugins/kibana/settings/sections/indices/add_data_steps/install_filebeat_step'; import '../../styles/_add_data_wizard.less'; @@ -24,7 +25,7 @@ modules.get('apps/settings') location: 'Add Data' }); - var totalSteps = 4; + var totalSteps = 5; this.stepResults = {}; this.setCurrentStep = (step) => { @@ -77,10 +78,10 @@ modules.get('apps/settings') return safeConfirm('Going back will reset any changes you\'ve made to this step, do you want to continue?') .then( () => { - if ($state.currentStep < 1) { + if ($state.currentStep < 2) { delete this.stepResults.pipeline; } - if ($state.currentStep < 2) { + if ($state.currentStep < 3) { delete this.stepResults.indexPattern; } this.currentStep = newValue; diff --git a/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_es_to_kibana_converter.js b/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_es_to_kibana_converter.js new file mode 100644 index 00000000000000..bd33b51257b9d1 --- /dev/null +++ b/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_es_to_kibana_converter.js @@ -0,0 +1,14 @@ +import _ from 'lodash'; +import * as esToKibanaProcessorConverters from '../processors/es_to_kibana_converters'; + +export default function ingestPipelineApiEsToKibanaConverter(pipelineEsDocument) { + const esProcessors = _.get(pipelineEsDocument, 'config.processors'); + const result = { + processors: _.map(esProcessors, (processor) => { + const typeId = _.keys(processor)[0]; + return esToKibanaProcessorConverters[typeId](processor[typeId]); + }) + }; + + return result; +} diff --git a/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_kibana_to_es_converter.js b/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_kibana_to_es_converter.js index b26f14de1224a0..647ed49e9f6cdb 100644 --- a/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_kibana_to_es_converter.js +++ b/src/plugins/kibana/server/lib/converters/ingest_pipeline_api_kibana_to_es_converter.js @@ -1,5 +1,5 @@ import _ from 'lodash'; -import * as ingestProcessorApiKibanaToEsConverters from '../processors/converters'; +import * as ingestProcessorApiKibanaToEsConverters from '../processors/kibana_to_es_converters'; export default function ingestPipelineApiKibanaToEsConverter(pipelineApiDocument) { return { diff --git a/src/plugins/kibana/server/lib/processors/append/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/append/es_to_kibana_converter.js new file mode 100644 index 00000000000000..71f14d31a7eec0 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/append/es_to_kibana_converter.js @@ -0,0 +1,8 @@ +export default function append(processorEsDocument) { + return { + typeId: 'append', + processor_id: processorEsDocument.tag, + target_field: processorEsDocument.field, + values: processorEsDocument.value + }; +} diff --git a/src/plugins/kibana/server/lib/processors/convert/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/convert/es_to_kibana_converter.js new file mode 100644 index 00000000000000..db42dc49a4571d --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/convert/es_to_kibana_converter.js @@ -0,0 +1,17 @@ +export default function convert(processorEsDocument) { + const types = { + //: + auto: 'auto', + float: 'number', + string: 'string', + boolean: 'boolean' + }; + + return { + typeId: 'convert', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + target_field: processorEsDocument.target_field, + type: types[processorEsDocument.type] + }; +} diff --git a/src/plugins/kibana/server/lib/processors/date/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/date/es_to_kibana_converter.js new file mode 100644 index 00000000000000..5176162c7a503c --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/date/es_to_kibana_converter.js @@ -0,0 +1,27 @@ +const _ = require('lodash'); + +export default function date(processorEsDocument) { + const standardFormats = ['ISO8601', 'UNIX', 'UNIX_MS', 'TAI64N']; + + const formats = []; + let customFormat = ''; + _.forEach(processorEsDocument.formats, (format) => { + if (_.contains(standardFormats, format.toUpperCase())) { + formats.push(format.toUpperCase()); + } else { + formats.push('CUSTOM'); + customFormat = format; + } + }); + + return { + typeId: 'date', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + target_field: processorEsDocument.target_field, + formats: formats, + custom_format: customFormat, + timezone: processorEsDocument.timezone, + locale: processorEsDocument.locale + }; +} diff --git a/src/plugins/kibana/server/lib/processors/es_to_kibana_converters.js b/src/plugins/kibana/server/lib/processors/es_to_kibana_converters.js new file mode 100644 index 00000000000000..64c76f80d48495 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/es_to_kibana_converters.js @@ -0,0 +1,14 @@ +export append from '../processors/append/es_to_kibana_converter'; +export convert from '../processors/convert/es_to_kibana_converter'; +export date from '../processors/date/es_to_kibana_converter'; +export geoip from '../processors/geoip/es_to_kibana_converter'; +export grok from '../processors/grok/es_to_kibana_converter'; +export gsub from '../processors/gsub/es_to_kibana_converter'; +export join from '../processors/join/es_to_kibana_converter'; +export lowercase from '../processors/lowercase/es_to_kibana_converter'; +export remove from '../processors/remove/es_to_kibana_converter'; +export rename from '../processors/rename/es_to_kibana_converter'; +export set from '../processors/set/es_to_kibana_converter'; +export split from '../processors/split/es_to_kibana_converter'; +export trim from '../processors/trim/es_to_kibana_converter'; +export uppercase from '../processors/uppercase/es_to_kibana_converter'; diff --git a/src/plugins/kibana/server/lib/processors/geoip/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/geoip/es_to_kibana_converter.js new file mode 100644 index 00000000000000..af7a5116dd523b --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/geoip/es_to_kibana_converter.js @@ -0,0 +1,10 @@ +export default function geoip(processorEsDocument) { + return { + typeId: 'geoip', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + target_field: processorEsDocument.target_field, + database_file: processorEsDocument.database_file, + database_fields: processorEsDocument.properties + }; +} diff --git a/src/plugins/kibana/server/lib/processors/grok/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/grok/es_to_kibana_converter.js new file mode 100644 index 00000000000000..1fd6816015f070 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/grok/es_to_kibana_converter.js @@ -0,0 +1,8 @@ +export default function grok(processorEsDocument) { + return { + typeId: 'grok', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + pattern: processorEsDocument.pattern + }; +} diff --git a/src/plugins/kibana/server/lib/processors/gsub/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/gsub/es_to_kibana_converter.js new file mode 100644 index 00000000000000..322b897bd8dc64 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/gsub/es_to_kibana_converter.js @@ -0,0 +1,9 @@ +export default function gsub(processorEsDocument) { + return { + typeId: 'gsub', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + pattern: processorEsDocument.pattern, + replacement: processorEsDocument.replacement + }; +} diff --git a/src/plugins/kibana/server/lib/processors/join/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/join/es_to_kibana_converter.js new file mode 100644 index 00000000000000..47dfb1b0c1e848 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/join/es_to_kibana_converter.js @@ -0,0 +1,8 @@ +export default function join(processorEsDocument) { + return { + typeId: 'join', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + separator: processorEsDocument.separator + }; +} diff --git a/src/plugins/kibana/server/lib/processors/converters.js b/src/plugins/kibana/server/lib/processors/kibana_to_es_converters.js similarity index 100% rename from src/plugins/kibana/server/lib/processors/converters.js rename to src/plugins/kibana/server/lib/processors/kibana_to_es_converters.js diff --git a/src/plugins/kibana/server/lib/processors/lowercase/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/lowercase/es_to_kibana_converter.js new file mode 100644 index 00000000000000..12619fec26f256 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/lowercase/es_to_kibana_converter.js @@ -0,0 +1,7 @@ +export default function lowercase(processorEsDocument) { + return { + typeId: 'lowercase', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field + }; +} diff --git a/src/plugins/kibana/server/lib/processors/remove/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/remove/es_to_kibana_converter.js new file mode 100644 index 00000000000000..4ee979a28ffd1f --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/remove/es_to_kibana_converter.js @@ -0,0 +1,7 @@ +export default function remove(processorEsDocument) { + return { + typeId: 'remove', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field + }; +} diff --git a/src/plugins/kibana/server/lib/processors/rename/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/rename/es_to_kibana_converter.js new file mode 100644 index 00000000000000..edbffff934ad56 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/rename/es_to_kibana_converter.js @@ -0,0 +1,8 @@ +export default function rename(processorEsDocument) { + return { + typeId: 'rename', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + target_field: processorEsDocument.target_field + }; +} diff --git a/src/plugins/kibana/server/lib/processors/set/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/set/es_to_kibana_converter.js new file mode 100644 index 00000000000000..8a1a35538aa3e7 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/set/es_to_kibana_converter.js @@ -0,0 +1,8 @@ +export default function set(processorEsDocument) { + return { + typeId: 'set', + processor_id: processorEsDocument.tag, + target_field: processorEsDocument.field, + value: processorEsDocument.value + }; +} diff --git a/src/plugins/kibana/server/lib/processors/split/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/split/es_to_kibana_converter.js new file mode 100644 index 00000000000000..881b7a7316cbee --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/split/es_to_kibana_converter.js @@ -0,0 +1,8 @@ +export default function split(processorEsDocument) { + return { + typeId: 'split', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field, + separator: processorEsDocument.separator + }; +} diff --git a/src/plugins/kibana/server/lib/processors/trim/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/trim/es_to_kibana_converter.js new file mode 100644 index 00000000000000..9a513601229e7a --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/trim/es_to_kibana_converter.js @@ -0,0 +1,7 @@ +export default function trim(processorEsDocument) { + return { + typeId: 'trim', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field + }; +} diff --git a/src/plugins/kibana/server/lib/processors/uppercase/es_to_kibana_converter.js b/src/plugins/kibana/server/lib/processors/uppercase/es_to_kibana_converter.js new file mode 100644 index 00000000000000..b6ec60cd8059f3 --- /dev/null +++ b/src/plugins/kibana/server/lib/processors/uppercase/es_to_kibana_converter.js @@ -0,0 +1,7 @@ +export default function uppercase(processorEsDocument) { + return { + typeId: 'uppercase', + processor_id: processorEsDocument.tag, + source_field: processorEsDocument.field + }; +} diff --git a/src/plugins/kibana/server/routes/api/ingest/index.js b/src/plugins/kibana/server/routes/api/ingest/index.js index 8b723c800946a0..8c95aa11c2cb1c 100644 --- a/src/plugins/kibana/server/routes/api/ingest/index.js +++ b/src/plugins/kibana/server/routes/api/ingest/index.js @@ -2,6 +2,7 @@ import { registerPost } from './register_post'; import { registerDelete } from './register_delete'; import { registerProcessors } from './register_processors'; import { registerSimulate } from './register_simulate'; +import { registerPipelines } from './register_pipelines'; import { registerData } from './register_data'; export default function (server) { @@ -9,5 +10,6 @@ export default function (server) { registerDelete(server); registerProcessors(server); registerSimulate(server); + registerPipelines(server); registerData(server); } diff --git a/src/plugins/kibana/server/routes/api/ingest/register_pipelines.js b/src/plugins/kibana/server/routes/api/ingest/register_pipelines.js new file mode 100644 index 00000000000000..16247270b644e6 --- /dev/null +++ b/src/plugins/kibana/server/routes/api/ingest/register_pipelines.js @@ -0,0 +1,54 @@ +import _ from 'lodash'; +import esToKibanaPipelineConverter from '../../../lib/converters/ingest_pipeline_api_es_to_kibana_converter'; +import handleESError from '../../../lib/handle_es_error'; + +function handlePipelinesResponse(response) { + const pipelines = _.get(response, 'pipelines'); + const results = _.map(pipelines, 'id'); + + return results; +} + +function handlePipelineResponse(response) { + const esPipeline = _.get(response, 'pipelines[0]'); + const kibanaPipeline = esToKibanaPipelineConverter(esPipeline); + return kibanaPipeline; +} + +export function registerPipelines(server) { + server.route({ + path: '/api/kibana/ingest/pipelines', + method: 'GET', + handler: function (request, reply) { + const boundCallWithRequest = _.partial(server.plugins.elasticsearch.callWithRequest, request); + + return boundCallWithRequest('transport.request', { + path: '/_ingest/pipeline/*', + method: 'GET' + }) + .then(handlePipelinesResponse) + .then(reply) + .catch((error) => { + reply(handleESError(error)); + }); + } + }); + + server.route({ + path: '/api/kibana/ingest/pipeline/{id}', + method: 'GET', + handler: function (request, reply) { + const boundCallWithRequest = _.partial(server.plugins.elasticsearch.callWithRequest, request); + + return boundCallWithRequest('transport.request', { + path: `/_ingest/pipeline/${request.params.id}`, + method: 'GET' + }) + .then(handlePipelineResponse) + .then(reply) + .catch((error) => { + reply(handleESError(error)); + }); + } + }); +}; diff --git a/src/ui/public/ingest/ingest.js b/src/ui/public/ingest/ingest.js index bee1cb564d3af3..9ec5f45ebbd440 100644 --- a/src/ui/public/ingest/ingest.js +++ b/src/ui/public/ingest/ingest.js @@ -71,4 +71,31 @@ export default function IngestProvider($rootScope, $http, config, $q) { }); }; + this.getPipelines = function () { + function unpack(response) { + return response.data; + } + + return $http.get(`${ingestAPIPrefix}/pipelines`) + .then(unpack) + .catch(err => { + return $q.reject(new Error('Error fetching pipelines')); + }); + }; + + this.getPipeline = function (id) { + function unpack(response) { + const pipeline = response.data; + pipeline.processors = _.map(pipeline.processors, processor => keysToCamelCaseShallow(processor)); + + return pipeline; + } + + return $http.get(`${ingestAPIPrefix}/pipeline/${id}`) + .then(unpack) + .catch(err => { + return $q.reject(new Error('Error fetching pipeline')); + }); + }; + }