diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js index 7fa57e0..97d4d03 100644 --- a/build/webpack.base.conf.js +++ b/build/webpack.base.conf.js @@ -11,7 +11,8 @@ module.exports = { context: resolve('src'), entry: { './module': './module.ts', - './panel/graph_panel/module': './panel/graph_panel/graph_ctrl.ts' + './panel/graph_panel/module': './panel/graph_panel/graph_ctrl.ts', + './datasource/module': './datasource/module.ts' }, output: { filename: '[name].js', @@ -35,7 +36,8 @@ module.exports = { { from: 'plugin.json' }, { from: 'img/*' }, { from: 'panel/graph_panel/plugin.json', to: 'panel/graph_panel/plugin.json' }, - { from: 'panel/graph_panel/partials/*' } + { from: 'panel/graph_panel/partials/*' }, + { from: 'datasource/plugin.json', to: 'datasource/plugin.json' }, ]) ], resolve: { diff --git a/src/config/config_ctrl.ts b/src/config/config_ctrl.ts index 6e125a4..49ee100 100644 --- a/src/config/config_ctrl.ts +++ b/src/config/config_ctrl.ts @@ -1,36 +1,13 @@ import template from './template.html'; -import { normalizeUrl } from '../utlis'; class ConfigCtrl { static template = template; appModel: any; - appEditCtrl: any; constructor() { if(this.appModel.jsonData === undefined) { this.appModel.jsonData = {}; } - - this.appEditCtrl.setPreUpdateHook(this.preUpdate.bind(this)); - this.appEditCtrl.setPostUpdateHook(this.postUpdate.bind(this)); - } - - preUpdate() { - this.normalizeUrl(); - return Promise.resolve(); - } - - postUpdate() { - // TODO: check whether hasticServerUrl is accessible - if(!this.appModel.enabled) { - return Promise.resolve(); - } - - return { message: 'Hastic app installed!' }; - } - - normalizeUrl() { - this.appModel.jsonData.hasticServerUrl = normalizeUrl(this.appModel.jsonData.hasticServerUrl); } } diff --git a/src/config/template.html b/src/config/template.html index 309c183..d3f5a12 100644 --- a/src/config/template.html +++ b/src/config/template.html @@ -1,12 +1 @@ -

Enter your Hastic config

-
-
- - -
-
+ diff --git a/src/datasource/config_ctrl.ts b/src/datasource/config_ctrl.ts new file mode 100644 index 0000000..cb02297 --- /dev/null +++ b/src/datasource/config_ctrl.ts @@ -0,0 +1,33 @@ +import { normalizeUrl } from '../utlis'; +import configTemplate from './partials/config.html'; + + +export class HasticConfigCtrl { + public static template = configTemplate; + public ACCESS_OPTIONS = [ + { key: 'proxy', value: 'Server (Default)' }, + { key: 'direct', value: 'Browser' } + ]; + + public showAccessHelp = false; + + constructor(private $scope: any) { + if(this.$scope.current === undefined) { + this.$scope.current = { + url: '', + access: 'proxy' + }; + } + } + + normalizeUrl() { + if(this.$scope.current.url === '') { + return; + } + this.$scope.current.url = normalizeUrl(this.$scope.current.url); + } + + toggleAccessHelp() { + this.showAccessHelp = !this.showAccessHelp; + } +} diff --git a/src/datasource/datasource.ts b/src/datasource/datasource.ts new file mode 100644 index 0000000..9d5d6a0 --- /dev/null +++ b/src/datasource/datasource.ts @@ -0,0 +1,37 @@ +import HasticAPI from './hastic_api'; + +import { BackendSrv } from 'grafana/app/core/services/backend_srv'; + +export class HasticDatasource { + private hastic: HasticAPI; + + /** @ngInject */ + constructor(instanceSettings: any, backendSrv: BackendSrv) { + this.hastic = new HasticAPI(instanceSettings, backendSrv); + } + + async query(options: any) { + console.log(options); + } + + async testDatasource() { + try { + await this.hastic.get('/'); + // TODO: check if it is hastic + return { + status: 'success', title: 'Success', + message: 'Datasource is working' + }; + } catch(err) { + console.error(err); + return { + status: 'error', title: 'Error', + message: 'Hastic connection error' + }; + } + } + + metricFindQuery(options: any) { + return []; + } +} diff --git a/src/datasource/hastic_api.ts b/src/datasource/hastic_api.ts new file mode 100644 index 0000000..4c9b836 --- /dev/null +++ b/src/datasource/hastic_api.ts @@ -0,0 +1,29 @@ +import { BackendSrv } from 'grafana/app/core/services/backend_srv'; + +export default class HasticAPI { + private url: string; + + constructor(instanceSettings: any, private backendSrv: BackendSrv) { + this.url = instanceSettings.url; + } + + get(url: string, params?: any) { + return this._query('GET', url, params); + } + + private async _query(method: string, url: string, data?: any) { + method = method.toUpperCase(); + let options: any = { + method, + url: this.url + url + }; + if(method === 'GET' || method === 'DELETE') { + options.params = data; + } else { + options.data = data; + } + + const response = await this.backendSrv.datasourceRequest(options); + return response.data; + } +} diff --git a/src/datasource/module.ts b/src/datasource/module.ts new file mode 100644 index 0000000..e3767cd --- /dev/null +++ b/src/datasource/module.ts @@ -0,0 +1,10 @@ +import { HasticDatasource } from './datasource'; +import { HasticQueryCtrl } from './query_ctrl'; +import { HasticConfigCtrl } from './config_ctrl'; + + +export { + HasticDatasource as Datasource, + HasticConfigCtrl as ConfigCtrl, + HasticQueryCtrl as QueryCtrl +}; diff --git a/src/datasource/partials/config.html b/src/datasource/partials/config.html new file mode 100644 index 0000000..27b755a --- /dev/null +++ b/src/datasource/partials/config.html @@ -0,0 +1,87 @@ +
+

HTTP

+
+
+
+ Hastic Server URL + + +

Specify a complete Hastic Server HTTP URL (for example http://your_hastic_server:8000)

+ + Your access method is Browser, this means the URL + needs to be accessible from the browser. + + + Your access method is Server, this means the URL + needs to be accessible from the grafana backend/server. + +
+
+
+ +
+
+ Access +
+ +
-
-
Analytic Units
-
-
- - - - - -
- - - - - +
+
+
Hastic server at "{{ctrl.backendURL}}" is not available
+ +
-