Commit 541cd2e4 by Torkel Ödegaard

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

parent 4322f29f
...@@ -13,14 +13,19 @@ import ( ...@@ -13,14 +13,19 @@ import (
) )
func CreateDashboardSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapshotCommand) { func CreateDashboardSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapshotCommand) {
cmd.Key = util.GetRandomString(32)
cmd.DeleteKey = util.GetRandomString(32)
if cmd.External { 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.OrgId = -1
cmd.UserId = -1 cmd.UserId = -1
metrics.M_Api_Dashboard_Snapshot_External.Inc(1) metrics.M_Api_Dashboard_Snapshot_External.Inc(1)
} else { } else {
cmd.Key = util.GetRandomString(32)
cmd.DeleteKey = util.GetRandomString(32)
cmd.OrgId = c.OrgId cmd.OrgId = c.OrgId
cmd.UserId = c.UserId cmd.UserId = c.UserId
metrics.M_Api_Dashboard_Snapshot_Create.Inc(1) metrics.M_Api_Dashboard_Snapshot_Create.Inc(1)
...@@ -78,5 +83,5 @@ func DeleteDashboardSnapshot(c *middleware.Context) { ...@@ -78,5 +83,5 @@ func DeleteDashboardSnapshot(c *middleware.Context) {
return 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."})
} }
...@@ -24,15 +24,16 @@ type DashboardSnapshot struct { ...@@ -24,15 +24,16 @@ type DashboardSnapshot struct {
// COMMANDS // COMMANDS
type CreateDashboardSnapshotCommand struct { type CreateDashboardSnapshotCommand struct {
Dashboard map[string]interface{} `json:"dashboard" binding:"Required"` Dashboard map[string]interface{} `json:"dashboard" binding:"Required"`
External bool `json:"external"` Expires int64 `json:"expires"`
ExternalUrl string `json:"externalUrl"`
Expires int64 `json:"expires"` // these are passed when storing an external snapshot ref
External bool `json:"external"`
OrgId int64 `json:"-"` Key string `json:"key"`
UserId int64 `json:"-"` DeleteKey string `json:"deleteKey"`
Key string `json:"-"`
DeleteKey string `json:"-"` OrgId int64 `json:"-"`
UserId int64 `json:"-"`
Result *DashboardSnapshot Result *DashboardSnapshot
} }
......
...@@ -24,16 +24,15 @@ func CreateDashboardSnapshot(cmd *m.CreateDashboardSnapshotCommand) error { ...@@ -24,16 +24,15 @@ func CreateDashboardSnapshot(cmd *m.CreateDashboardSnapshotCommand) error {
} }
snapshot := &m.DashboardSnapshot{ snapshot := &m.DashboardSnapshot{
Key: cmd.Key, Key: cmd.Key,
DeleteKey: cmd.DeleteKey, DeleteKey: cmd.DeleteKey,
OrgId: cmd.OrgId, OrgId: cmd.OrgId,
UserId: cmd.UserId, UserId: cmd.UserId,
External: cmd.External, External: cmd.External,
ExternalUrl: cmd.ExternalUrl, Dashboard: cmd.Dashboard,
Dashboard: cmd.Dashboard, Expires: expires,
Expires: expires, Created: time.Now(),
Created: time.Now(), Updated: time.Now(),
Updated: time.Now(),
} }
_, err := sess.Insert(snapshot) _, err := sess.Insert(snapshot)
......
...@@ -29,6 +29,9 @@ function (angular, _) { ...@@ -29,6 +29,9 @@ function (angular, _) {
{text: 'Public on the web', value: 3}, {text: 'Public on the web', value: 3},
]; ];
$scope.externalUrl = 'http://snapshots-origin.raintank.io';
$scope.apiUrl = '/api/snapshots';
$scope.createSnapshot = function(external) { $scope.createSnapshot = function(external) {
$scope.dashboard.snapshot = { $scope.dashboard.snapshot = {
timestamp: new Date() timestamp: new Date()
...@@ -71,21 +74,18 @@ function (angular, _) { ...@@ -71,21 +74,18 @@ function (angular, _) {
var cmdData = { var cmdData = {
dashboard: dash, dashboard: dash,
external: external === true,
expires: $scope.snapshot.expires, expires: $scope.snapshot.expires,
}; };
var apiUrl = '/api/snapshots/'; var postUrl = external ? $scope.externalUrl + $scope.apiUrl : $scope.apiUrl;
if (external) {
apiUrl = "http://snapshots-origin.raintank.io/api/snapshots";
}
backendSrv.post(apiUrl, cmdData).then(function(results) { backendSrv.post(postUrl, cmdData).then(function(results) {
$scope.loading = false; $scope.loading = false;
if (external) { if (external) {
$scope.deleteUrl = results.deleteUrl; $scope.deleteUrl = results.deleteUrl;
$scope.snapshotUrl = results.url; $scope.snapshotUrl = results.url;
$scope.saveExternalSnapshotRef(cmdData, results);
} else { } else {
var baseUrl = $location.absUrl().replace($location.url(), ""); var baseUrl = $location.absUrl().replace($location.url(), "");
$scope.snapshotUrl = baseUrl + '/dashboard/snapshot/' + results.key; $scope.snapshotUrl = baseUrl + '/dashboard/snapshot/' + results.key;
...@@ -98,6 +98,14 @@ function (angular, _) { ...@@ -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);
};
}); });
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment