From 9e892bddf03bc929e4e6b5b4eeba2f4fbfb0ca3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 28 Feb 2015 09:46:37 +0100 Subject: [PATCH] More work on restoring features after moving to plugin model for datasources, #1276 #1472 --- pkg/api/frontendsettings.go | 13 +++- src/app/features/all.js | 6 -- .../features/dashboard/dashboardNavCtrl.js | 68 +++++-------------- src/app/features/dashboard/importCtrl.js | 49 +++++++------ .../features/dashboard/partials/import.html | 16 ++--- src/app/features/org/orgDetailsCtrl.js | 3 +- src/app/features/panel/panelSrv.js | 3 + .../datasource/grafana}/datasource.js | 0 .../grafana}/partials/query.editor.html | 0 .../plugins/datasource/grafana/plugin.json | 15 ++++ .../datasource}/influxdb/datasource.js | 0 .../datasource}/influxdb/funcEditor.js | 0 .../datasource}/influxdb/influxSeries.js | 0 .../influxdb/partials/annotations.editor.html | 0 .../influxdb/partials/query.editor.html | 0 .../plugins/datasource/influxdb/plugin.json | 18 +++++ .../datasource}/influxdb/queryBuilder.js | 0 .../datasource}/influxdb/queryCtrl.js | 0 .../datasource}/opentsdb/datasource.js | 0 .../datasource/opentsdb/partials/config.html | 0 .../opentsdb/partials/query.editor.html | 0 .../plugins/datasource/opentsdb/plugin.json | 16 +++++ .../datasource}/opentsdb/queryCtrl.js | 4 -- src/app/services/backendSrv.js | 4 ++ src/app/services/datasourceSrv.js | 12 ++-- 25 files changed, 119 insertions(+), 108 deletions(-) rename src/app/{features/grafanaDatasource => plugins/datasource/grafana}/datasource.js (100%) rename src/app/{features/grafanaDatasource => plugins/datasource/grafana}/partials/query.editor.html (100%) create mode 100644 src/app/plugins/datasource/grafana/plugin.json rename src/app/{features => plugins/datasource}/influxdb/datasource.js (100%) rename src/app/{features => plugins/datasource}/influxdb/funcEditor.js (100%) rename src/app/{features => plugins/datasource}/influxdb/influxSeries.js (100%) rename src/app/{features => plugins/datasource}/influxdb/partials/annotations.editor.html (100%) rename src/app/{features => plugins/datasource}/influxdb/partials/query.editor.html (100%) create mode 100644 src/app/plugins/datasource/influxdb/plugin.json rename src/app/{features => plugins/datasource}/influxdb/queryBuilder.js (100%) rename src/app/{features => plugins/datasource}/influxdb/queryCtrl.js (100%) rename src/app/{features => plugins/datasource}/opentsdb/datasource.js (100%) create mode 100644 src/app/plugins/datasource/opentsdb/partials/config.html rename src/app/{features => plugins/datasource}/opentsdb/partials/query.editor.html (100%) create mode 100644 src/app/plugins/datasource/opentsdb/plugin.json rename src/app/{features => plugins/datasource}/opentsdb/queryCtrl.js (96%) diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index 8fb7242122c..0644f158b4c 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -1,6 +1,8 @@ package api import ( + "errors" + "fmt" "strconv" "github.com/grafana/grafana/pkg/bus" @@ -41,7 +43,7 @@ func getFrontendSettingsMap(c *middleware.Context) (map[string]interface{}, erro meta, exists := plugins.DataSources[ds.Type] if !exists { - //return nil, errors.New(fmt.Sprintf("Could not find plugin definition for data source: %v", ds.Type)) + return nil, errors.New(fmt.Sprintf("Could not find plugin definition for data source: %v", ds.Type)) } dsMap["meta"] = meta @@ -75,9 +77,14 @@ func getFrontendSettingsMap(c *middleware.Context) (map[string]interface{}, erro } // add grafana backend data source + grafanaDatasourceMeta, _ := plugins.DataSources["grafana"] datasources["grafana"] = map[string]interface{}{ - "type": "grafana", - "grafanaDB": true, + "type": "grafana", + "meta": grafanaDatasourceMeta, + } + + if defaultDatasource == "" { + defaultDatasource = "grafana" } jsonObj := map[string]interface{}{ diff --git a/src/app/features/all.js b/src/app/features/all.js index 620f8c1bee1..c8ba6214dc9 100644 --- a/src/app/features/all.js +++ b/src/app/features/all.js @@ -2,16 +2,10 @@ define([ './panellinkeditor/module', './annotations/annotationsSrv', './templating/templateSrv', -// './graphite/datasource', -// './influxdb/datasource', -// './influxdb_08/datasource', -// './opentsdb/datasource', -// './elasticsearch/datasource', './dashboard/all', './panel/all', './profile/profileCtrl', './profile/changePasswordCtrl', './org/all', './admin/all', - './grafanaDatasource/datasource', ], function () {}); diff --git a/src/app/features/dashboard/dashboardNavCtrl.js b/src/app/features/dashboard/dashboardNavCtrl.js index bbe22fc0b67..a577749945b 100644 --- a/src/app/features/dashboard/dashboardNavCtrl.js +++ b/src/app/features/dashboard/dashboardNavCtrl.js @@ -6,16 +6,14 @@ define([ 'store', 'filesaver' ], -function (angular, _, moment, config, store) { +function (angular, _, moment) { 'use strict'; var module = angular.module('grafana.controllers'); - module.controller('DashboardNavCtrl', function($scope, $rootScope, alertSrv, $location, playlistSrv, datasourceSrv, timeSrv) { + module.controller('DashboardNavCtrl', function($scope, $rootScope, alertSrv, $location, playlistSrv, backendSrv, timeSrv) { $scope.init = function() { - $scope.db = datasourceSrv.getGrafanaDB(); - $scope.onAppEvent('save-dashboard', $scope.saveDashboard); $scope.onAppEvent('delete-dashboard', $scope.deleteDashboard); @@ -24,16 +22,6 @@ function (angular, _, moment, config, store) { }); }; - $scope.set_default = function() { - store.set('grafanaDashboardDefault', $location.path()); - alertSrv.set('Home Set','This page has been set as your default dashboard','success',5000); - }; - - $scope.purge_default = function() { - store.delete('grafanaDashboardDefault'); - alertSrv.set('Local Default Clear','Your default dashboard has been reset to the default','success', 5000); - }; - $scope.openEditView = function(editview) { var search = _.extend($location.search(), {editview: editview}); $location.search(search); @@ -41,12 +29,12 @@ function (angular, _, moment, config, store) { $scope.starDashboard = function() { if ($scope.dashboardMeta.isStarred) { - $scope.db.unstarDashboard($scope.dashboard.id).then(function() { - $scope.dashboardMeta.isStarred = false; + backendSrv.delete('/api/user/stars/dashboard/' + $scope.dashboard.id).then(function() { + $scope.dashboardMeta.isStarred = true; }); } else { - $scope.db.starDashboard($scope.dashboard.id).then(function() { + backendSrv.post('/api/user/stars/dashboard/' + $scope.dashboard.id).then(function() { $scope.dashboardMeta.isStarred = true; }); } @@ -59,12 +47,6 @@ function (angular, _, moment, config, store) { }); }; - $scope.passwordCache = function(pwd) { - if (!window.sessionStorage) { return null; } - if (!pwd) { return window.sessionStorage["grafanaAdminPassword"]; } - window.sessionStorage["grafanaAdminPassword"] = pwd; - }; - $scope.openSearch = function() { $scope.appEvent('show-dash-search'); }; @@ -75,20 +57,18 @@ function (angular, _, moment, config, store) { $scope.saveDashboard = function() { var clone = angular.copy($scope.dashboard); - $scope.db.saveDashboard(clone) - .then(function(result) { - $scope.appEvent('alert-success', ['Dashboard saved', 'Saved as ' + result.title]); - if (result.url !== $location.path()) { - $location.search({}); - $location.path(result.url); - } + backendSrv.saveDashboard(clone).then(function(data) { + $scope.appEvent('dashboard-saved', $scope.dashboard); - $scope.appEvent('dashboard-saved', $scope.dashboard); + var dashboardUrl = '/dashboard/db/' + data.slug; - }, function(err) { - $scope.appEvent('alert-error', ['Save failed', err]); - }); + if (dashboardUrl !== $location.path()) { + $location.url(dashboardUrl); + } + + $scope.appEvent('alert-success', ['Dashboard saved', 'Saved as ' + clone.title]); + }); }; $scope.deleteDashboard = function() { @@ -102,10 +82,9 @@ function (angular, _, moment, config, store) { }; $scope.deleteDashboardConfirmed = function() { - $scope.db.deleteDashboard($scope.dashboardMeta.slug).then(function() { + backendSrv.delete('/api/dashboards/db/' + $scope.dashboardMeta.slug).then(function() { $scope.appEvent('alert-success', ['Dashboard Deleted', $scope.dashboard.title + ' has been deleted']); - }, function(err) { - $scope.appEvent('alert-error', ['Deleted failed', err]); + $location.url('/'); }); }; @@ -149,21 +128,6 @@ function (angular, _, moment, config, store) { $scope.appEvent('show-json-editor', { object: $scope.dashboard }); }; - $scope.openSaveDropdown = function() { - $scope.isFavorite = playlistSrv.isCurrentFavorite($scope.dashboard); - $scope.saveDropdownOpened = true; - }; - - $scope.markAsFavorite = function() { - playlistSrv.markAsFavorite($scope.dashboard); - $scope.isFavorite = true; - }; - - $scope.removeAsFavorite = function() { - playlistSrv.removeAsFavorite($scope.dashboard); - $scope.isFavorite = false; - }; - $scope.stopPlaylist = function() { playlistSrv.stop(1); }; diff --git a/src/app/features/dashboard/importCtrl.js b/src/app/features/dashboard/importCtrl.js index 8b3612ea70e..641a02e776f 100644 --- a/src/app/features/dashboard/importCtrl.js +++ b/src/app/features/dashboard/importCtrl.js @@ -18,35 +18,33 @@ function (angular, _) { $scope.infoText = ''; $scope.importing = false; - _.each(datasourceSrv.getAll(), function(ds) { - if (ds.type === 'influxdb' || ds.type === 'elasticsearch') { - $scope.sourceName = ds.name; - $scope.datasources.push(ds.name); - } else if (ds.type === 'grafana') { - $scope.datasources.push(ds.name); + _.each(datasourceSrv.getAll(), function(ds, key) { + if (ds.type === 'influxdb_08' || ds.type === 'elasticsearch') { + $scope.sourceName = key; + $scope.datasources.push(key); } }); }; $scope.startImport = function() { - $scope.sourceDs = datasourceSrv.get($scope.sourceName); - $scope.destDs = datasourceSrv.get($scope.destName); + datasourceSrv.get($scope.sourceName).then(function(ds) { + $scope.dashboardSource = ds; + $scope.dashboardSource.searchDashboards('title:').then(function(results) { + $scope.dashboards = results.dashboards; - $scope.sourceDs.searchDashboards('title:').then(function(results) { - $scope.dashboards = results.dashboards; + if ($scope.dashboards.length === 0) { + $scope.infoText = 'No dashboards found'; + return; + } - if ($scope.dashboards.length === 0) { - $scope.infoText = 'No dashboards found'; - return; - } - - $scope.importing = true; - $scope.imported = []; - $scope.next(); - }, function(err) { - var resp = err.message || err.statusText || 'Unknown error'; - var message = "Failed to load dashboards from selected data source, response from server was: " + resp; - $scope.appEvent('alert-error', ['Import failed', message]); + $scope.importing = true; + $scope.imported = []; + $scope.next(); + }, function(err) { + var resp = err.message || err.statusText || 'Unknown error'; + var message = "Failed to load dashboards from selected data source, response from server was: " + resp; + $scope.appEvent('alert-error', ['Import failed', message]); + }); }); }; @@ -65,12 +63,13 @@ function (angular, _) { $scope.imported.push(infoObj); $scope.infoText = "Importing " + $scope.imported.length + '/' + ($scope.imported.length + $scope.dashboards.length); - $scope.sourceDs.getDashboard(dash.id).then(function(loadedDash) { - $scope.destDs.saveDashboard(loadedDash).then(function() { + $scope.dashboardSource.getDashboard(dash.id).then(function(loadedDash) { + backendSrv.saveDashboard(loadedDash).then(function() { infoObj.info = "Done!"; $scope.next(); }, function(err) { - infoObj.info = "Error: " + err; + err.isHandled = true; + infoObj.info = "Error: " + (err.data || { message: 'Unknown' }).message; $scope.next(); }); }); diff --git a/src/app/features/dashboard/partials/import.html b/src/app/features/dashboard/partials/import.html index af02069657a..a942297ac59 100644 --- a/src/app/features/dashboard/partials/import.html +++ b/src/app/features/dashboard/partials/import.html @@ -8,7 +8,7 @@

Import file - Load dashboard JSON layout from file + Load dashboard from local .json file

@@ -21,7 +21,10 @@
-

Migrate dashboards

+

+ Migrate dashboards + Import dashboards from Elasticsearch or InfluxDB +