diff --git a/pkg/api/dashboard_snapshot.go b/pkg/api/dashboard_snapshot.go index dd9e8f81e5b..1c641d10c1c 100644 --- a/pkg/api/dashboard_snapshot.go +++ b/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."}) } diff --git a/pkg/models/dashboard_snapshot.go b/pkg/models/dashboard_snapshot.go index 12638f4150f..e8f37e2a236 100644 --- a/pkg/models/dashboard_snapshot.go +++ b/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"` + Dashboard map[string]interface{} `json:"dashboard" binding:"Required"` + Expires int64 `json:"expires"` - OrgId int64 `json:"-"` - UserId int64 `json:"-"` - Key string `json:"-"` - DeleteKey string `json:"-"` + // 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 } diff --git a/pkg/services/sqlstore/dashboard_snapshot.go b/pkg/services/sqlstore/dashboard_snapshot.go index 3f66f49f6b6..0bbb01ed6bd 100644 --- a/pkg/services/sqlstore/dashboard_snapshot.go +++ b/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) diff --git a/src/app/features/dashboard/shareSnapshotCtrl.js b/src/app/features/dashboard/shareSnapshotCtrl.js index 59a0b2ca10a..240bd33488b 100644 --- a/src/app/features/dashboard/shareSnapshotCtrl.js +++ b/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); + }; + }); });