Просмотр исходного кода

feat(dash export): dashboard export can now replace datasource names with variable and add inputs section

Torkel Ödegaard 9 лет назад
Родитель
Сommit
0f71838fdf

+ 2 - 2
public/app/features/dashboard/dashnav/dashnav.ts

@@ -9,7 +9,7 @@ import {DashboardExporter} from '../exporter';
 export class DashNavCtrl {
 export class DashNavCtrl {
 
 
   /** @ngInject */
   /** @ngInject */
-  constructor($scope, $rootScope, alertSrv, $location, playlistSrv, backendSrv, $timeout) {
+  constructor($scope, $rootScope, alertSrv, $location, playlistSrv, backendSrv, $timeout, datasourceSrv) {
 
 
     $scope.init = function() {
     $scope.init = function() {
       $scope.onAppEvent('save-dashboard', $scope.saveDashboard);
       $scope.onAppEvent('save-dashboard', $scope.saveDashboard);
@@ -172,7 +172,7 @@ export class DashNavCtrl {
 
 
     $scope.exportDashboard = function() {
     $scope.exportDashboard = function() {
       var clone = $scope.dashboard.getSaveModelClone();
       var clone = $scope.dashboard.getSaveModelClone();
-      var exporter = new DashboardExporter();
+      var exporter = new DashboardExporter(datasourceSrv);
       exporter.export(clone);
       exporter.export(clone);
     };
     };
 
 

+ 3 - 0
public/app/features/dashboard/dynamic_dashboard_srv.ts

@@ -4,6 +4,8 @@ import config from 'app/core/config';
 import angular from 'angular';
 import angular from 'angular';
 import _ from 'lodash';
 import _ from 'lodash';
 
 
+import coreModule from 'app/core/core_module';
+
 export class DynamicDashboardSrv {
 export class DynamicDashboardSrv {
   iteration: number;
   iteration: number;
   dashboard: any;
   dashboard: any;
@@ -181,3 +183,4 @@ export class DynamicDashboardSrv {
     });
     });
   }
   }
 }
 }
+

+ 39 - 10
public/app/features/dashboard/exporter.ts

@@ -8,21 +8,50 @@ import {DynamicDashboardSrv} from './dynamic_dashboard_srv';
 
 
 export class DashboardExporter {
 export class DashboardExporter {
 
 
-  makeExportable(dashboard) {
-    var dynSrv = new DynamicDashboardSrv();
-    dynSrv.process(dashboard, {cleanUpOnly: true});
+  constructor(private datasourceSrv) {
+  }
 
 
-    return dashboard;
+  makeExportable(dash) {
+    var dynSrv = new DynamicDashboardSrv();
+    dynSrv.process(dash, {cleanUpOnly: true});
+
+    var inputs = [];
+    var datasources = {};
+    var promises = [];
+
+    for (let row of dash.rows) {
+      _.each(row.panels, (panel) => {
+        if (panel.datasource !== undefined) {
+          promises.push(this.datasourceSrv.get(panel.datasource).then(ds => {
+            var refName = 'DS_' + ds.name.toUpperCase();
+            datasources[panel.datasource] = {
+              name: refName,
+              type: 'datasource',
+              pluginId: ds.meta.id,
+            };
+            panel.datasource = '${' + refName  +'}';
+          }));
+        }
+      });
+    }
+
+    return Promise.all(promises).then(() => {
+      _.each(datasources, (value, key) => {
+        inputs.push(value);
+      });
+
+      dash["__inputs"] = inputs;
+      return dash;
+    });
   }
   }
 
 
   export(dashboard) {
   export(dashboard) {
-    var clean = this.makeExportable(dashboard);
-    var blob = new Blob([angular.toJson(clean, true)], { type: "application/json;charset=utf-8" });
-    var wnd: any = window;
-    wnd.saveAs(blob, clean.title + '-' + new Date().getTime());
+    return this.makeExportable(dashboard).then(clean => {
+      var blob = new Blob([angular.toJson(clean, true)], { type: "application/json;charset=utf-8" });
+      var wnd: any = window;
+      wnd.saveAs(blob, clean.title + '-' + new Date().getTime());
+    });
   }
   }
 
 
 }
 }
 
 
-
-

+ 19 - 4
public/app/features/dashboard/specs/exporter_specs.ts

@@ -5,7 +5,7 @@ import {DashboardExporter} from '../exporter';
 describe('given dashboard with repeated panels', function() {
 describe('given dashboard with repeated panels', function() {
   var dash, exported;
   var dash, exported;
 
 
-  beforeEach(() => {
+  beforeEach((done) => {
     dash = {
     dash = {
       rows: [],
       rows: [],
       templating: { list: [] }
       templating: { list: [] }
@@ -19,7 +19,7 @@ describe('given dashboard with repeated panels', function() {
     dash.rows.push({
     dash.rows.push({
       repeat: 'test',
       repeat: 'test',
       panels: [
       panels: [
-        {id: 2, repeat: 'apps'},
+        {id: 2, repeat: 'apps', datasource: 'gfdb'},
         {id: 2, repeat: null, repeatPanelId: 2},
         {id: 2, repeat: null, repeatPanelId: 2},
       ]
       ]
     });
     });
@@ -28,8 +28,18 @@ describe('given dashboard with repeated panels', function() {
       repeatRowId: 1
       repeatRowId: 1
     });
     });
 
 
-    var exporter = new DashboardExporter();
-    exported = exporter.makeExportable(dash);
+    var datasourceSrvStub = {
+      get: sinon.stub().returns(Promise.resolve({
+        name: 'gfdb',
+        meta: {id: "testdb"}
+      }))
+    };
+
+    var exporter = new DashboardExporter(datasourceSrvStub);
+    exporter.makeExportable(dash).then(clean => {
+      exported = clean;
+      done();
+    });
   });
   });
 
 
 
 
@@ -41,5 +51,10 @@ describe('given dashboard with repeated panels', function() {
     expect(exported.rows.length).to.be(1);
     expect(exported.rows.length).to.be(1);
   });
   });
 
 
+  it('should replace datasource refs', function() {
+    var panel = exported.rows[0].panels[0];
+    expect(panel.datasource).to.be("${DS_GFDB}");
+  });
+
 });
 });