diff --git a/public/app/core/utils/version.ts b/public/app/core/utils/version.ts index 70854482ce6..6ee1400df51 100644 --- a/public/app/core/utils/version.ts +++ b/public/app/core/utils/version.ts @@ -1,4 +1,6 @@ -const versionPattern = /(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z\.]+))?/; +import _ from 'lodash'; + +const versionPattern = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z\.]+))?/; export class SemVersion { major: number; @@ -20,6 +22,10 @@ export class SemVersion { let compared = new SemVersion(version); return !(this.major < compared.major || this.minor < compared.minor || this.patch < compared.patch); } + + isValid(): boolean { + return _.isNumber(this.major); + } } export function isVersionGtOrEq(a: string, b: string): boolean { diff --git a/public/app/plugins/datasource/graphite/config_ctrl.ts b/public/app/plugins/datasource/graphite/config_ctrl.ts index 4f6ebef77ea..595584691a2 100644 --- a/public/app/plugins/datasource/graphite/config_ctrl.ts +++ b/public/app/plugins/datasource/graphite/config_ctrl.ts @@ -2,12 +2,26 @@ export class GraphiteConfigCtrl { static templateUrl = 'public/app/plugins/datasource/graphite/partials/config.html'; + datasourceSrv: any; current: any; /** @ngInject */ - constructor($scope) { + constructor($scope, datasourceSrv) { + this.datasourceSrv = datasourceSrv; this.current.jsonData = this.current.jsonData || {}; this.current.jsonData.graphiteVersion = this.current.jsonData.graphiteVersion || '0.9'; + + this.autoDetectGraphiteVersion(); + } + + autoDetectGraphiteVersion() { + this.datasourceSrv.loadDatasource(this.current.name) + .then((ds) => { + return ds.getVersion(); + }).then((version) => { + this.graphiteVersions.push({name: version, value: version}); + this.current.jsonData.graphiteVersion = version; + }); } graphiteVersions = [ diff --git a/public/app/plugins/datasource/graphite/datasource.ts b/public/app/plugins/datasource/graphite/datasource.ts index ba7a564158b..319f2e498a7 100644 --- a/public/app/plugins/datasource/graphite/datasource.ts +++ b/public/app/plugins/datasource/graphite/datasource.ts @@ -2,7 +2,7 @@ import _ from 'lodash'; import * as dateMath from 'app/core/utils/datemath'; -import {isVersionGtOrEq} from 'app/core/utils/version'; +import {isVersionGtOrEq, SemVersion} from 'app/core/utils/version'; /** @ngInject */ export function GraphiteDatasource(instanceSettings, $q, backendSrv, templateSrv) { @@ -273,6 +273,23 @@ export function GraphiteDatasource(instanceSettings, $q, backendSrv, templateSrv }); }; + this.getVersion = function() { + let httpOptions = { + method: 'GET', + url: '/version/_', // Prevent last / trimming + }; + + return this.doGraphiteRequest(httpOptions).then(results => { + if (results.data) { + let semver = new SemVersion(results.data); + return semver.isValid() ? results.data : ''; + } + return ''; + }).catch(() => { + return ''; + }); + }; + this.testDatasource = function() { return this.metricFindQuery('*').then(function () { return { status: "success", message: "Data source is working"};