From 4317e4c4a268017e745a282132195f7881a588d8 Mon Sep 17 00:00:00 2001 From: Anthony Woods Date: Wed, 2 Mar 2016 14:21:25 +0800 Subject: [PATCH 1/2] Add support for pre/post update hooks in the PluginEditCtrl. This allows users to intercept the update procedure from their own controller to modify the pluginSettings before they are saved and perform additional tasks like syncing state via a third party API. --- public/app/features/plugins/edit_ctrl.ts | 55 ++++++++++++++++++++---- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/public/app/features/plugins/edit_ctrl.ts b/public/app/features/plugins/edit_ctrl.ts index 3d1e724e0c4..6d693c19a4e 100644 --- a/public/app/features/plugins/edit_ctrl.ts +++ b/public/app/features/plugins/edit_ctrl.ts @@ -9,6 +9,8 @@ export class PluginEditCtrl { includedPanels: any; includedDatasources: any; tabIndex: number; + preUpdateHook: () => any; + postUpdateHook: () => any; /** @ngInject */ constructor(private backendSrv: any, private $routeParams: any) { @@ -24,20 +26,55 @@ export class PluginEditCtrl { } update() { - var updateCmd = _.extend({ - pluginId: this.model.pluginId, - orgId: this.model.orgId, - enabled: this.model.enabled, - pinned: this.model.pinned, - jsonData: this.model.jsonData, - secureJsonData: this.model.secureJsonData, - }, {}); + var chain = Promise.resolve(); + var self = this; + // if set, handle the preUpdateHook. If this returns a promise, + // the next step of execution will block until the promise resolves. + // if the promise is rejected, this update will be aborted. + if (this.preUpdateHook != null) { + chain = chain.then(function() { + return Promise.resolve(self.preUpdateHook()); + }); + } - this.backendSrv.post(`/api/org/plugins/${this.pluginId}/settings`, updateCmd).then(function() { + // Perform the core update procedure + chain = chain.then(function() { + var updateCmd = _.extend({ + pluginId: self.model.pluginId, + orgId: self.model.orgId, + enabled: self.model.enabled, + pinned: self.model.pinned, + jsonData: self.model.jsonData, + secureJsonData: self.model.secureJsonData, + }, {}); + + return self.backendSrv.post(`/api/org/plugins/${self.pluginId}/settings`, updateCmd); + }); + + // if set, performt he postUpdate hook. If a promise is returned it will block + // the final step of the update procedure (reloading the page) until the promise + // resolves. If the promise is rejected the page will not be reloaded. + if (this.postUpdateHook != null) { + chain = chain.then(function() { + return Promise.resolve(this.postUpdateHook()); + }); + } + + // all stesp in the update procedure are complete, so reload the page to make changes + // take effect. + chain.then(function() { window.location.href = window.location.href; }); } + setPreUpdateHook(callback: () => any) { + this.preUpdateHook = callback; + } + + setPOstUpdateHook(callback: () => any) { + this.postUpdateHook = callback; + } + toggleEnabled() { this.update(); } From 8b64b2113eb38a674b8d42919b104d51e31ca2c2 Mon Sep 17 00:00:00 2001 From: bergquist Date: Wed, 2 Mar 2016 08:38:56 +0100 Subject: [PATCH 2/2] docs(plugins): improve install docs for plugins --- docs/mkdocs.yml | 5 ++++- docs/sources/plugins/installation.md | 16 +++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 5e99db71bdf..e88b5ec4237 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -86,7 +86,10 @@ pages: - ['http_api/snapshot.md', 'API', 'Snapshot API'] - ['http_api/other.md', 'API', 'Other API'] -- ['plugins/plugins.md', 'Plugins', 'Plugins'] +- ['plugins/overview.md', 'Plugins', 'Overview'] +- ['plugins/installation.md', 'Plugins', 'Installation'] +- ['plugins/datasources.md', 'Plugins', 'Datasource plugins'] +- ['plugins/panels.md', 'Plugins', 'Panel plugins'] - ['tutorials/index.md', 'Tutorials', 'Tutorials'] - ['tutorials/hubot_howto.md', 'Tutorials', 'How To integrate Hubot and Grafana'] diff --git a/docs/sources/plugins/installation.md b/docs/sources/plugins/installation.md index c8bc9e813eb..b6db0e82b2c 100644 --- a/docs/sources/plugins/installation.md +++ b/docs/sources/plugins/installation.md @@ -8,37 +8,39 @@ page_keywords: grafana, plugins, documentation ## Installing plugins -The easiest way to install plugins is by using the CLI tool grafana-cli which is bundled with grafana. +The easiest way to install plugins is by using the CLI tool grafana-cli which is bundled with grafana. Before any modification take place after modifieng plugins, grafana-server need to be restarted. ### Grafana plugin directory On Linux systems the grafana-cli will assume that the grafana plugin directory is "/var/lib/grafana/plugins". Its possible to override the directory which grafana-cli will operate on by specifing the --path flag. On Windows systems this parameter have to be specified for every call. -### List available plugins +### Grafana-cli commands + +List available plugins ``` grafana-cli list-remove ``` -### Install a plugin type +Install a plugin type ``` grafana-cli install ``` -### List installed plugins +List installed plugins ``` grafana-cli ls ``` -### Upgrade all installed plugins +Upgrade all installed plugins ``` grafana-cli upgrade-all ``` -### Upgrade one plugin +Upgrade one plugin ``` grafana-cli upgrade ``` -### Remove one plugin +Remove one plugin ``` grafana-cli remove ```