Skip to content

Commit

Permalink
[SavedObjects] move all saved objects access to an API
Browse files Browse the repository at this point in the history
  • Loading branch information
spalger committed Apr 25, 2017
1 parent 55ba578 commit a7c3f65
Show file tree
Hide file tree
Showing 61 changed files with 1,240 additions and 822 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -195,7 +195,7 @@
"validate-npm-package-name": "2.2.2",
"vision": "4.1.0",
"webpack": "github:elastic/webpack#fix/query-params-for-aliased-loaders",
"whatwg-fetch": "0.9.0",
"whatwg-fetch": "2.0.3",
"wreck": "6.2.0",
"yauzl": "2.7.0"
},
Expand Down
1 change: 0 additions & 1 deletion src/core_plugins/elasticsearch/lib/create_proxy.js
Expand Up @@ -5,7 +5,6 @@ import { assign } from 'lodash';
function createProxy(server, method, path, config) {
const proxies = new Map([
['/elasticsearch', server.plugins.elasticsearch.getCluster('data')],
['/es_admin', server.plugins.elasticsearch.getCluster('admin')]
]);

const responseHandler = function (err, upstreamResponse, request, reply) {
Expand Down
@@ -1,6 +1,7 @@
import 'plugins/kibana/dashboard/saved_dashboard/saved_dashboard';
import { uiModules } from 'ui/modules';
import { SavedObjectLoader } from 'ui/courier/saved_object/saved_object_loader';
import { SavedObjectsClientProvider } from 'ui/saved_objects';
import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';

const module = uiModules.get('app/dashboard');
Expand All @@ -13,6 +14,7 @@ savedObjectManagementRegistry.register({
});

// This is the only thing that gets injected into controllers
module.service('savedDashboards', function (SavedDashboard, kbnIndex, esAdmin, kbnUrl) {
return new SavedObjectLoader(SavedDashboard, kbnIndex, esAdmin, kbnUrl);
module.service('savedDashboards', function (SavedDashboard, Private, kbnUrl) {
const savedObjectsClient = Private(SavedObjectsClientProvider);
return new SavedObjectLoader(SavedDashboard, savedObjectsClient, kbnUrl);
});
Expand Up @@ -2,6 +2,8 @@ import 'plugins/kibana/discover/saved_searches/_saved_search';
import 'ui/notify';
import { uiModules } from 'ui/modules';
import { SavedObjectLoader } from 'ui/courier/saved_object/saved_object_loader';
import { SavedObjectsClientProvider } from 'ui/saved_objects';

import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';
const module = uiModules.get('discover/saved_searches', [
'kibana/notify'
Expand All @@ -14,18 +16,14 @@ savedObjectManagementRegistry.register({
title: 'searches'
});

module.service('savedSearches', function (Promise, config, kbnIndex, esAdmin, createNotifier, SavedSearch, kbnUrl) {
const savedSearchLoader = new SavedObjectLoader(SavedSearch, kbnIndex, esAdmin, kbnUrl);
// Customize loader properties since adding an 's' on type doesn't work for type 'search' .
savedSearchLoader.loaderProperties = {
name: 'searches',
noun: 'Saved Search',
nouns: 'saved searches'
};

savedSearchLoader.urlFor = function (id) {
return kbnUrl.eval('#/discover/{{id}}', { id: id });
};

return savedSearchLoader;
module.service('savedSearches', function (Promise, Private, config, createNotifier, SavedSearch, kbnUrl) {
const savedObjectsClient = Private(SavedObjectsClientProvider);
return new SavedObjectLoader(SavedSearch, savedObjectsClient, kbnUrl, {
loaderProperties: {
name: 'searches',
noun: 'Saved Search',
nouns: 'saved searches'
},
getUrl: id => kbnUrl.eval('#/discover/{{id}}', { id: id })
});
});
Expand Up @@ -2,7 +2,6 @@ import _ from 'lodash';
import { IndexPatternMissingIndices } from 'ui/errors';
import 'ui/directives/validate_index_name';
import 'ui/directives/auto_select_if_only_one';
import { RefreshKibanaIndex } from '../refresh_kibana_index';
import uiRoutes from 'ui/routes';
import { uiModules } from 'ui/modules';
import template from './create_index_pattern.html';
Expand All @@ -17,7 +16,6 @@ uiRoutes
uiModules.get('apps/management')
.controller('managementIndicesCreate', function ($scope, kbnUrl, Private, Notifier, indexPatterns, es, config, Promise, $translate) {
const notify = new Notifier();
const refreshKibanaIndex = Private(RefreshKibanaIndex);
const intervals = indexPatterns.intervals;
let samplePromise;

Expand Down Expand Up @@ -210,14 +208,12 @@ uiModules.get('apps/management')
return;
}

refreshKibanaIndex().then(() => {
if (!config.get('defaultIndex')) {
config.set('defaultIndex', id);
}
if (!config.get('defaultIndex')) {
config.set('defaultIndex', id);
}

indexPatterns.cache.clear(id);
kbnUrl.change(`/management/kibana/indices/${id}`);
});
indexPatterns.cache.clear(id);
kbnUrl.change(`/management/kibana/indices/${id}`);
}).catch(err => {
if (err instanceof IndexPatternMissingIndices) {
return notify.error($translate.instant('KIBANA-NO_INDICES_MATCHING_PATTERN'));
Expand Down
Expand Up @@ -4,7 +4,6 @@ import './indexed_fields_table';
import './scripted_fields_table';
import './scripted_field_editor';
import './source_filters_table';
import { RefreshKibanaIndex } from '../refresh_kibana_index';
import UrlProvider from 'ui/url';
import { IndicesEditSectionsProvider } from './edit_sections';
import uiRoutes from 'ui/routes';
Expand Down Expand Up @@ -44,7 +43,6 @@ uiModules.get('apps/management')
$scope, $location, $route, config, courier, Notifier, Private, AppState, docTitle, confirmModal) {
const notify = new Notifier();
const $state = $scope.state = new AppState();
const refreshKibanaIndex = Private(RefreshKibanaIndex);

$scope.kbnUrl = Private(UrlProvider);
$scope.indexPattern = $route.current.locals.indexPattern;
Expand Down Expand Up @@ -110,7 +108,6 @@ uiModules.get('apps/management')
}

courier.indexPatterns.delete($scope.indexPattern)
.then(refreshKibanaIndex)
.then(function () {
$location.url('/management/kibana/index');
})
Expand Down

This file was deleted.

Expand Up @@ -6,6 +6,7 @@ import objectIndexHTML from 'plugins/kibana/management/sections/objects/_objects
import 'ui/directives/file_upload';
import uiRoutes from 'ui/routes';
import { uiModules } from 'ui/modules';
import { SavedObjectsClientProvider } from 'ui/saved_objects';

uiRoutes
.when('/management/kibana/objects', {
Expand All @@ -18,12 +19,13 @@ uiRoutes
});

uiModules.get('apps/management')
.directive('kbnManagementObjects', function (kbnIndex, Notifier, Private, kbnUrl, Promise, confirmModal) {
.directive('kbnManagementObjects', function (Notifier, Private, kbnUrl, Promise, confirmModal) {
return {
restrict: 'E',
controllerAs: 'managementObjectsController',
controller: function ($scope, $injector, $q, AppState, esAdmin) {
controller: function ($scope, $injector, $q, AppState) {
const notify = new Notifier({ location: 'Saved Objects' });
const savedObjectsClient = Private(SavedObjectsClientProvider);

// TODO: Migrate all scope variables to the controller.
const $state = $scope.state = new AppState();
Expand Down Expand Up @@ -52,7 +54,7 @@ uiModules.get('apps/management')
});
});

$q.all(services).then(function (data) {
return $q.all(services).then(function (data) {
$scope.services = sortBy(data, 'title');
if ($state.tab) $scope.currentTab = find($scope.services, { title: $state.tab });

Expand Down Expand Up @@ -130,28 +132,25 @@ uiModules.get('apps/management')
// TODO: Migrate all scope methods to the controller.
$scope.exportAll = () => Promise
.map($scope.services, service => service.service
.scanAll('')
.then(result => result.hits.map(hit => extend(hit, { type: service.type })))
.scanAll()
.then(hits => hits.map(hit => extend(hit, { type: service.type })))
)
.then(results => retrieveAndExportDocs(flattenDeep(results)))
.catch(error => notify.error(error));

function retrieveAndExportDocs(objs) {
if (!objs.length) return notify.error('No saved objects to export.');
esAdmin.mget({
index: kbnIndex,
body: { docs: objs.map(transformToMget) }
})
return savedObjectsClient.mget(
objs.map(obj => ({
type: obj.type,
id: obj.id
}))
)
.then(function (response) {
saveToFile(response.docs.map(partialRight(pick, '_id', '_type', '_source')));
});
}

// Takes an object and returns the associated data needed for an mget API request
function transformToMget(obj) {
return { _id: obj.id, _type: obj.type };
}

function saveToFile(results) {
const blob = new Blob([angular.toJson(results, true)], { type: 'application/json' });
saveAs(blob, 'export.json');
Expand Down Expand Up @@ -235,18 +234,11 @@ uiModules.get('apps/management')

return Promise.map(docTypes.searches, importDocument)
.then(() => Promise.map(docTypes.other, importDocument))
.then(refreshIndex)
.then(refreshData)
.catch(notify.error);
});
};

function refreshIndex() {
return esAdmin.indices.refresh({
index: kbnIndex
});
}

// TODO: Migrate all scope methods to the controller.
$scope.changeTab = function (tab) {
$scope.currentTab = tab;
Expand Down
44 changes: 15 additions & 29 deletions src/core_plugins/kibana/public/management/sections/objects/_view.js
Expand Up @@ -4,6 +4,7 @@ import rison from 'rison-node';
import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';
import objectViewHTML from 'plugins/kibana/management/sections/objects/_view.html';
import { IndexPatternsCastMappingTypeProvider } from 'ui/index_patterns/_cast_mapping_type';
import { SavedObjectsClientProvider } from 'ui/saved_objects';
import uiRoutes from 'ui/routes';
import { uiModules } from 'ui/modules';

Expand All @@ -13,12 +14,13 @@ uiRoutes
});

uiModules.get('apps/management')
.directive('kbnManagementObjectsView', function (kbnIndex, Notifier, confirmModal) {
.directive('kbnManagementObjectsView', function (Notifier, confirmModal) {
return {
restrict: 'E',
controller: function ($scope, $injector, $routeParams, $location, $window, $rootScope, esAdmin, Private) {
controller: function ($scope, $injector, $routeParams, $location, $window, $rootScope, Private) {
const notify = new Notifier({ location: 'SavedObject view' });
const castMappingType = Private(IndexPatternsCastMappingTypeProvider);
const savedObjectsClient = Private(SavedObjectsClientProvider);
const serviceObj = savedObjectManagementRegistry.get($routeParams.service);
const service = $injector.get(serviceObj.service);

Expand Down Expand Up @@ -104,11 +106,7 @@ uiModules.get('apps/management')

$scope.title = service.type;

esAdmin.get({
index: kbnIndex,
type: service.type,
id: $routeParams.id
})
savedObjectsClient.get(service.type, $routeParams.id)
.then(function (obj) {
$scope.obj = obj;
$scope.link = service.urlFor(obj._id);
Expand Down Expand Up @@ -171,11 +169,7 @@ uiModules.get('apps/management')
*/
$scope.delete = function () {
function doDelete() {
esAdmin.delete({
index: kbnIndex,
type: service.type,
id: $routeParams.id
})
savedObjectsClient.delete(service.type, $routeParams.id)
.then(function () {
return redirectHandler('deleted');
})
Expand Down Expand Up @@ -208,11 +202,9 @@ uiModules.get('apps/management')
_.set(source, field.name, value);
});

esAdmin.index({
index: kbnIndex,
type: service.type,
id: $routeParams.id,
body: source
savedObjectsClient.save(service.type, $routeParams.id, source, {
allowTitleConflict: true,
allowOverwrite: true,
})
.then(function () {
return redirectHandler('updated');
Expand All @@ -221,19 +213,13 @@ uiModules.get('apps/management')
};

function redirectHandler(action) {
return esAdmin.indices.refresh({
index: kbnIndex
})
.then(function () {
const msg = 'You successfully ' + action + ' the "' + $scope.obj._source.title + '" ' + $scope.title.toLowerCase() + ' object';

$location.path('/management/kibana/objects').search({
_a: rison.encode({
tab: serviceObj.title
})
});
notify.info(msg);
const msg = 'You successfully ' + action + ' the "' + $scope.obj._source.title + '" ' + $scope.title.toLowerCase() + ' object';
$location.path('/management/kibana/objects').search({
_a: rison.encode({
tab: serviceObj.title
})
});
notify.info(msg);
}
}
};
Expand Down
Expand Up @@ -2,6 +2,7 @@ import 'plugins/kibana/visualize/saved_visualizations/_saved_vis';
import { VisTypesRegistryProvider } from 'ui/registry/vis_types';
import { uiModules } from 'ui/modules';
import { SavedObjectLoader } from 'ui/courier/saved_object/saved_object_loader';
import { SavedObjectsClientProvider } from 'ui/saved_objects';
import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';

const app = uiModules.get('app/visualize');
Expand All @@ -13,13 +14,14 @@ savedObjectManagementRegistry.register({
title: 'visualizations'
});

app.service('savedVisualizations', function (Promise, esAdmin, kbnIndex, SavedVis, Private, Notifier, kbnUrl) {
app.service('savedVisualizations', function (Promise, SavedVis, Private, Notifier, kbnUrl) {
const visTypes = Private(VisTypesRegistryProvider);
const notify = new Notifier({
location: 'Saved Visualization Service'
});

const saveVisualizationLoader = new SavedObjectLoader(SavedVis, kbnIndex, esAdmin, kbnUrl);
const savedObjectsClient = Private(SavedObjectsClientProvider);
const saveVisualizationLoader = new SavedObjectLoader(SavedVis, savedObjectsClient, kbnUrl);
saveVisualizationLoader.mapHits = function (hit) {
const source = hit._source;
source.id = hit._id;
Expand Down
23 changes: 11 additions & 12 deletions src/core_plugins/timelion/public/services/saved_sheets.js
@@ -1,4 +1,5 @@
import { SavedObjectLoader } from 'ui/courier/saved_object/saved_object_loader';
import { SavedObjectsClientProvider } from 'ui/saved_objects';
import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';

define(function (require) {
Expand All @@ -15,18 +16,16 @@ define(function (require) {
});

// This is the only thing that gets injected into controllers
module.service('savedSheets', function (Promise, SavedSheet, kbnIndex, esAdmin, kbnUrl) {
const savedSheetLoader = new SavedObjectLoader(SavedSheet, kbnIndex, esAdmin, kbnUrl);
savedSheetLoader.urlFor = function (id) {
return kbnUrl.eval('#/{{id}}', { id: id });
};

// Customize loader properties since adding an 's' on type doesn't work for type 'timelion-sheet'.
savedSheetLoader.loaderProperties = {
name: 'timelion-sheet',
noun: 'Saved Sheets',
nouns: 'saved sheets'
};
module.service('savedSheets', function (Promise, Private, SavedSheet, kbnUrl) {
const savedObjectsClient = Private(SavedObjectsClientProvider);
const savedSheetLoader = new SavedObjectLoader(SavedSheet, savedObjectsClient, kbnUrl, {
loaderProperties: {
name: 'timelion-sheet',
noun: 'Saved Sheets',
nouns: 'saved sheets'
},
getUrl: id => kbnUrl.eval('#/{{id}}', { id: id })
});
return savedSheetLoader;
});
});
4 changes: 3 additions & 1 deletion src/server/kbn_server.js
Expand Up @@ -19,6 +19,7 @@ import uiMixin from '../ui';
import uiSettingsMixin from '../ui/settings';
import optimizeMixin from '../optimize';
import pluginsInitializeMixin from './plugins/initialize';
import { savedObjectsMixin } from './saved_objects';

const rootDir = fromRoot('.');

Expand Down Expand Up @@ -53,7 +54,8 @@ module.exports = class KbnServer {
configCompleteMixin,
// setup this.uiExports and this.bundles
uiMixin,

// setup saved object routes
savedObjectsMixin,
// setup server.uiSettings
uiSettingsMixin,

Expand Down

0 comments on commit a7c3f65

Please sign in to comment.