// ################################################################################ // # Copyright (c) 2018 JamesOsgood // # // # Permission is hereby granted, free of charge, to any person obtaining a copy // # of this software and associated documentation files (the "Software"), to deal // # in the Software without restriction, including without limitation the rights // # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // # copies of the Software, and to permit persons to whom the Software is // # furnished to do so, subject to the following conditions: // # // # The above copyright notice and this permission notice shall be included in all // # copies or substantial portions of the Software. // # // # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // # SOFTWARE. // ################################################################################ import _ from "lodash"; export class GenericDatasource { constructor(instanceSettings, $q, backendSrv, templateSrv) { this.type = instanceSettings.type; this.url = instanceSettings.url; this.name = instanceSettings.name; this.db = { 'url' : instanceSettings.jsonData.mongodb_url, 'db' : instanceSettings.jsonData.mongodb_db } this.q = $q; this.backendSrv = backendSrv; this.templateSrv = templateSrv; this.withCredentials = instanceSettings.withCredentials; this.headers = {'Content-Type': 'application/json'}; // Assert valid sign in parameter if (typeof instanceSettings.basicAuth === 'string' && instanceSettings.basicAuth.length > 0) { this.headers['Authorization'] = instanceSettings.basicAuth; } } query(options) { var query = this.buildQueryParameters(options); query.targets = query.targets.filter(t => !t.hide); query.db = this.db if (query.targets.length <= 0) { return this.q.when({data: []}); } return this.doRequest({ url: this.url + '/query', data: query, method: 'POST' }); } // Testing whether connection is valid testDatasource() { return this.doRequest({ url: this.url + '/', data : { db : this.db }, method: 'POST', }).then(response => { if (response.status === 200) { return { status: response.data.status, message: response.data.message, title: response.data.display_status }; } }); } annotationQuery(options) { var query = this.templateSrv.replace(options.annotation.query, {}, 'glob'); var annotationQuery = { range: options.range, annotation: { name: options.annotation.name, datasource: options.annotation.datasource, enable: options.annotation.enable, iconColor: options.annotation.iconColor, query: query }, rangeRaw: options.rangeRaw }; return this.doRequest({ url: this.url + '/annotations', method: 'POST', data: annotationQuery }).then(result => { response.data.$$status = result.status; response.data.$$config = result.config; return result.data; }); } metricFindQuery(query) { var interpolated = { target: this.templateSrv.replace(query, null, '') }; interpolated.db = this.db return this.doRequest({ url: this.url + '/search', data: interpolated, method: 'POST', }).then(this.mapToTextValue); } mapToTextValue(result) { return _.map(result.data, (d, i) => { if (d && d.text && d.value) { return { text: d.text, value: d.value }; } else if (_.isObject(d)) { return { text: d, value: i}; } return { text: d, value: d }; }); } doRequest(options) { options.withCredentials = this.withCredentials; options.headers = this.headers; return this.backendSrv.datasourceRequest(options); } buildQueryParameters(options) { //remove place holder targets options.targets = _.filter(options.targets, target => { return target.target !== 'select metric'; }); var targets = _.map(options.targets, target => { return { target: this.templateSrv.replace(target.target, options.scopedVars, ''), refId: target.refId, hide: target.hide, type: target.type || 'timeserie' }; }); options.targets = targets; return options; } }