Browse Source

Dashboard snapshot: more work on snapshot deletion, and saving external reference, #1623

Torkel Ödegaard 10 years ago
parent
commit
541cd2e430

+ 9 - 4
pkg/api/dashboard_snapshot.go

@@ -13,14 +13,19 @@ import (
 )
 
 func CreateDashboardSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapshotCommand) {
-	cmd.Key = util.GetRandomString(32)
-	cmd.DeleteKey = util.GetRandomString(32)
-
 	if cmd.External {
+		// external snapshot ref requires key and delete key
+		if cmd.Key != "" && cmd.DeleteKey != "" {
+			c.JsonApiErr(400, "Missing key and delete key for external snapshot", nil)
+			return
+		}
+
 		cmd.OrgId = -1
 		cmd.UserId = -1
 		metrics.M_Api_Dashboard_Snapshot_External.Inc(1)
 	} else {
+		cmd.Key = util.GetRandomString(32)
+		cmd.DeleteKey = util.GetRandomString(32)
 		cmd.OrgId = c.OrgId
 		cmd.UserId = c.UserId
 		metrics.M_Api_Dashboard_Snapshot_Create.Inc(1)
@@ -78,5 +83,5 @@ func DeleteDashboardSnapshot(c *middleware.Context) {
 		return
 	}
 
-	c.JSON(200, util.DynMap{"message": "Snapshot deleted. It might take an hour before it is cleared from a CDN cache."})
+	c.JSON(200, util.DynMap{"message": "Snapshot deleted. It might take an hour before it's cleared from a CDN cache."})
 }

+ 10 - 9
pkg/models/dashboard_snapshot.go

@@ -24,15 +24,16 @@ type DashboardSnapshot struct {
 // COMMANDS
 
 type CreateDashboardSnapshotCommand struct {
-	Dashboard   map[string]interface{} `json:"dashboard" binding:"Required"`
-	External    bool                   `json:"external"`
-	ExternalUrl string                 `json:"externalUrl"`
-	Expires     int64                  `json:"expires"`
-
-	OrgId     int64  `json:"-"`
-	UserId    int64  `json:"-"`
-	Key       string `json:"-"`
-	DeleteKey string `json:"-"`
+	Dashboard map[string]interface{} `json:"dashboard" binding:"Required"`
+	Expires   int64                  `json:"expires"`
+
+	// these are passed when storing an external snapshot ref
+	External  bool   `json:"external"`
+	Key       string `json:"key"`
+	DeleteKey string `json:"deleteKey"`
+
+	OrgId  int64 `json:"-"`
+	UserId int64 `json:"-"`
 
 	Result *DashboardSnapshot
 }

+ 9 - 10
pkg/services/sqlstore/dashboard_snapshot.go

@@ -24,16 +24,15 @@ func CreateDashboardSnapshot(cmd *m.CreateDashboardSnapshotCommand) error {
 		}
 
 		snapshot := &m.DashboardSnapshot{
-			Key:         cmd.Key,
-			DeleteKey:   cmd.DeleteKey,
-			OrgId:       cmd.OrgId,
-			UserId:      cmd.UserId,
-			External:    cmd.External,
-			ExternalUrl: cmd.ExternalUrl,
-			Dashboard:   cmd.Dashboard,
-			Expires:     expires,
-			Created:     time.Now(),
-			Updated:     time.Now(),
+			Key:       cmd.Key,
+			DeleteKey: cmd.DeleteKey,
+			OrgId:     cmd.OrgId,
+			UserId:    cmd.UserId,
+			External:  cmd.External,
+			Dashboard: cmd.Dashboard,
+			Expires:   expires,
+			Created:   time.Now(),
+			Updated:   time.Now(),
 		}
 
 		_, err := sess.Insert(snapshot)

+ 14 - 6
src/app/features/dashboard/shareSnapshotCtrl.js

@@ -29,6 +29,9 @@ function (angular, _) {
       {text: 'Public on the web', value: 3},
     ];
 
+    $scope.externalUrl = 'http://snapshots-origin.raintank.io';
+    $scope.apiUrl = '/api/snapshots';
+
     $scope.createSnapshot = function(external) {
       $scope.dashboard.snapshot = {
         timestamp: new Date()
@@ -71,21 +74,18 @@ function (angular, _) {
 
       var cmdData = {
         dashboard: dash,
-        external: external === true,
         expires: $scope.snapshot.expires,
       };
 
-      var apiUrl = '/api/snapshots/';
-      if (external) {
-        apiUrl = "http://snapshots-origin.raintank.io/api/snapshots";
-      }
+      var postUrl = external ? $scope.externalUrl + $scope.apiUrl : $scope.apiUrl;
 
-      backendSrv.post(apiUrl, cmdData).then(function(results) {
+      backendSrv.post(postUrl, cmdData).then(function(results) {
         $scope.loading = false;
 
         if (external) {
           $scope.deleteUrl = results.deleteUrl;
           $scope.snapshotUrl = results.url;
+          $scope.saveExternalSnapshotRef(cmdData, results);
         } else {
           var baseUrl = $location.absUrl().replace($location.url(), "");
           $scope.snapshotUrl = baseUrl + '/dashboard/snapshot/' + results.key;
@@ -98,6 +98,14 @@ function (angular, _) {
       });
     };
 
+    $scope.saveExternalSnapshotRef = function(cmdData, results) {
+      // save external in local instance as well
+      cmdData.external = true;
+      cmdData.key = results.key;
+      cmdData.delete_key = results.delete_key;
+      backendSrv.post('/api/snapshots/', cmdData);
+    };
+
   });
 
 });