diff --git a/Gruntfile.js b/Gruntfile.js index e943351..093988c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,7 +6,7 @@ module.exports = function(grunt) { grunt.initConfig({ - clean: ["dist"], + clean: ["dist/*"], copy: { src_to_dist: { diff --git a/dist/README.md b/dist/README.md index c27ddf9..c7ee521 100644 --- a/dist/README.md +++ b/dist/README.md @@ -6,6 +6,14 @@ Skydive Datasource for Grafana 3.x. ## Installation +### Docker + +```console +docker run -d --name=grafana -p 3000:3000 skydive/skydive-grafana-datasource +``` + +### Sources + ```console $ git clone https://github.com/skydive-project/skydive-grafana-datasource.git $ cd skydive-grafana-datasource diff --git a/dist/config_ctrl.js b/dist/config_ctrl.js index 47379d6..60bfa85 100644 --- a/dist/config_ctrl.js +++ b/dist/config_ctrl.js @@ -23,11 +23,14 @@ System.register([], function (_export, _context) { this.scope = $scope; this.versionFields = [{ - text: "0.9.x", - value: "0.9" + text: ">= 0.22", + value: "0.22" }, { - text: ">= 0.10.x", + text: ">= 0.10", value: "0.10" + }, { + text: "0.9", + value: "0.9" }]; this.current.jsonData.version = this.current.jsonData.version || this.versionFields[0].value; } diff --git a/dist/config_ctrl.js.map b/dist/config_ctrl.js.map index d92685a..881dda8 100644 --- a/dist/config_ctrl.js.map +++ b/dist/config_ctrl.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/config_ctrl.js"],"names":["SkydiveConfigCtrl","$scope","scope","versionFields","text","value","current","jsonData","version","console","log","templateUrl"],"mappings":";;;;;;;;;;;;;;;;mCAAaA,iB;;;AAEX;AACA,mCAAYC,MAAZ,EAAoB;AAAA;;AAClB,eAAKC,KAAL,GAAaD,MAAb;AAEA,eAAKE,aAAL,GAAqB,CACnB;AAACC,YAAAA,IAAI,EAAE,OAAP;AAAgBC,YAAAA,KAAK,EAAE;AAAvB,WADmB,EAEnB;AAACD,YAAAA,IAAI,EAAE,WAAP;AAAoBC,YAAAA,KAAK,EAAE;AAA3B,WAFmB,CAArB;AAKC,eAAKC,OAAL,CAAaC,QAAb,CAAsBC,OAAtB,GAAgC,KAAKF,OAAL,CAAaC,QAAb,CAAsBC,OAAtB,IAAiC,KAAKL,aAAL,CAAmB,CAAnB,EAAsBE,KAAvF;AACF;;;;2CAEgB;AACfI,YAAAA,OAAO,CAACC,GAAR,CAAY,KAAKJ,OAAL,CAAaC,QAAb,CAAsBC,OAAlC;AACD;;;;;;AAGHR,MAAAA,iBAAiB,CAACW,WAAlB,GAAgC,sBAAhC","sourcesContent":["export class SkydiveConfigCtrl {\n\n /** @ngInject */\n constructor($scope) {\n this.scope = $scope;\n\n this.versionFields = [\n {text: \"0.9.x\", value: \"0.9\"},\n {text: \">= 0.10.x\", value: \"0.10\"}\n ];\n\n this.current.jsonData.version = this.current.jsonData.version || this.versionFields[0].value;\n }\n\n versionChanged() {\n console.log(this.current.jsonData.version);\n }\n}\n\nSkydiveConfigCtrl.templateUrl = 'partials/config.html';\n"],"file":"config_ctrl.js"} \ No newline at end of file +{"version":3,"sources":["../src/config_ctrl.js"],"names":["SkydiveConfigCtrl","$scope","scope","versionFields","text","value","current","jsonData","version","console","log","templateUrl"],"mappings":";;;;;;;;;;;;;;;;mCAAaA,iB;;;AAEX;AACA,mCAAYC,MAAZ,EAAoB;AAAA;;AAClB,eAAKC,KAAL,GAAaD,MAAb;AAEA,eAAKE,aAAL,GAAqB,CACnB;AAAEC,YAAAA,IAAI,EAAE,SAAR;AAAmBC,YAAAA,KAAK,EAAE;AAA1B,WADmB,EAEnB;AAAED,YAAAA,IAAI,EAAE,SAAR;AAAmBC,YAAAA,KAAK,EAAE;AAA1B,WAFmB,EAGnB;AAAED,YAAAA,IAAI,EAAE,KAAR;AAAeC,YAAAA,KAAK,EAAE;AAAtB,WAHmB,CAArB;AAMA,eAAKC,OAAL,CAAaC,QAAb,CAAsBC,OAAtB,GAAgC,KAAKF,OAAL,CAAaC,QAAb,CAAsBC,OAAtB,IAAiC,KAAKL,aAAL,CAAmB,CAAnB,EAAsBE,KAAvF;AACD;;;;2CAEgB;AACfI,YAAAA,OAAO,CAACC,GAAR,CAAY,KAAKJ,OAAL,CAAaC,QAAb,CAAsBC,OAAlC;AACD;;;;;;AAGHR,MAAAA,iBAAiB,CAACW,WAAlB,GAAgC,sBAAhC","sourcesContent":["export class SkydiveConfigCtrl {\n\n /** @ngInject */\n constructor($scope) {\n this.scope = $scope;\n\n this.versionFields = [\n { text: \">= 0.22\", value: \"0.22\" },\n { text: \">= 0.10\", value: \"0.10\" },\n { text: \"0.9\", value: \"0.9\" }\n ];\n\n this.current.jsonData.version = this.current.jsonData.version || this.versionFields[0].value;\n }\n\n versionChanged() {\n console.log(this.current.jsonData.version);\n }\n}\n\nSkydiveConfigCtrl.templateUrl = 'partials/config.html';\n"],"file":"config_ctrl.js"} \ No newline at end of file diff --git a/dist/datasource.js b/dist/datasource.js index 3203143..fc221f3 100644 --- a/dist/datasource.js +++ b/dist/datasource.js @@ -1,9 +1,9 @@ "use strict"; -System.register(["lodash", "moment"], function (_export, _context) { +System.register(["lodash", "moment", "./semver"], function (_export, _context) { "use strict"; - var _, moment, SkydiveDatasource; + var _, moment, SemverCmp, SkydiveDatasource; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -16,6 +16,8 @@ System.register(["lodash", "moment"], function (_export, _context) { _ = _lodash.default; }, function (_moment) { moment = _moment.default; + }, function (_semver) { + SemverCmp = _semver.SemverCmp; }], execute: function () { _export("SkydiveDatasource", SkydiveDatasource = @@ -86,7 +88,7 @@ System.register(["lodash", "moment"], function (_export, _context) { }, { key: "gremlinTimeContext", value: function gremlinTimeContext(gremlin, request) { - if (this.version == "0.9") { + if (SemverCmp(this.version, "0.9") == 0) { gremlin = gremlin.replace(/^G\./i, 'G.At(' + request.to + ').'); gremlin = gremlin.replace(/\.Flows\([^)]*\)/i, '.Flows(Since(' + (request.to - request.from) + '))'); } else { @@ -190,7 +192,7 @@ System.register(["lodash", "moment"], function (_export, _context) { var start = metric.Start; var last = metric.Last; - if (_this3.version != "0.9") { + if (SemverCmp(_this3.version, "0.9") > 0) { start /= 1000; last /= 1000; } @@ -205,6 +207,10 @@ System.register(["lodash", "moment"], function (_export, _context) { }); return data; + }).catch(function (err) { + throw { + message: err.data + }; }); } }, { @@ -227,10 +233,25 @@ System.register(["lodash", "moment"], function (_export, _context) { }, { key: "testDatasource", value: function testDatasource() { - return this.backendSrv.datasourceRequest({ + var request = { url: this.url + '/api', method: 'GET' - }).then(function (response) { + }; + + if (SemverCmp(this.version, "0.9") > 0) { + request = { + url: this.url + '/api/topology', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + data: { + 'GremlinQuery': "G.At('-1s').V().Limit(1)" + } + }; + } + + return this.backendSrv.datasourceRequest(request).then(function (response) { if (response.status === 200) { return { status: "success", @@ -238,6 +259,16 @@ System.register(["lodash", "moment"], function (_export, _context) { title: "Success" }; } + }).catch(function (err) { + var msg = err.status + " - " + err.statusText; + + if (err.data.length > 0) { + msg += " : " + err.data; + } + + throw { + message: msg + }; }); } }]); diff --git a/dist/datasource.js.map b/dist/datasource.js.map index c94dd81..ee43a89 100644 --- a/dist/datasource.js.map +++ b/dist/datasource.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/datasource.js"],"names":["_","moment","SkydiveDatasource","instanceSettings","$q","backendSrv","templateSrv","console","log","type","url","name","version","jsonData","q","options","targets","filter","target","hide","gremlin","length","when","data","queries","map","targetToQuery","range","from","format","to","promises","doQueries","all","then","results","flatten","title","field","metricField","dedup","aggregates","mode","refId","requestToQuery","targetToRequest","request","replace","gremlinTimeContext","query","doQuery","doGremlinQuery","result","status","forEach","metrics","uuid","datapoints","metric","value","has","ABBytes","BABytes","RxBytes","ABPackets","BAPackets","RxPackets","TxPackets","start","Start","last","Last","valueOf","push","toArray","reverse","method","headers","datasourceRequest","response","message"],"mappings":"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","sourcesContent":["import _ from \"lodash\";\nimport moment from \"moment\";\n\nexport class SkydiveDatasource {\n\n /** @ngInject **/\n constructor(instanceSettings, $q, backendSrv, templateSrv) {\n console.log( instanceSettings);\n this.type = instanceSettings.type;\n this.url = instanceSettings.url;\n this.name = instanceSettings.name;\n this.version = instanceSettings.jsonData.version;\n this.q = $q;\n this.backendSrv = backendSrv;\n this.templateSrv = templateSrv;\n }\n\n // Called once per panel (graph)\n query(options) {\n var targets = _.filter(options.targets, target => {\n return !target.hide && target.gremlin && target.gremlin !== 'Gremlin query';\n });\n\n if (targets.length <= 0) {\n return this.q.when({data: []});\n }\n\n var queries = _.map(targets, target => {\n return this.targetToQuery(target, options.range.from.format('X'), options.range.to.format('X'));\n });\n\n var promises = this.doQueries(queries);\n return this.q.all(promises).then(function(results) {\n return { data: _.flatten(results) };\n });\n }\n\n targetToRequest(target, from, to) {\n return {\n title: target.title || \"\",\n gremlin: target.gremlin || \"\",\n field: target.metricField,\n dedup: target.dedup,\n aggregates: target.aggregates,\n mode: target.mode,\n from: from,\n to: to,\n refId: target.refId,\n hide: target.hide\n };\n }\n\n targetToQuery(target, from, to) {\n return this.requestToQuery(this.targetToRequest(target, from, to));\n }\n\n gremlinTimeContext(gremlin, request) {\n if (this.version == \"0.9\") {\n gremlin = gremlin.replace(/^G\\./i, 'G.At(' + request.to + ').');\n gremlin = gremlin.replace(/\\.Flows\\([^)]*\\)/i, '.Flows(Since(' + (request.to-request.from) + '))');\n } else {\n gremlin = gremlin.replace(/^G\\./i, 'G.At(' + request.to + ',' + (request.to-request.from) + ').');\n }\n\n return gremlin;\n }\n\n requestToQuery(request) {\n // removing Context/At and Metric from the original query if present\n var gremlin = request.gremlin.replace(/^G\\.At\\([^)]*\\)/i, 'G');\n gremlin = request.gremlin.replace(/^G\\.Context\\([^)]*\\)/i, 'G');\n gremlin = gremlin.replace(/\\.Metrics\\([^)]*\\)/i, '');\n gremlin = gremlin.replace(/\\.Aggregates\\([^)]*\\)/i, '');\n gremlin = gremlin.replace(/\\.Dedup\\([^)]*\\)/i, '');\n\n // add time context\n gremlin = this.gremlinTimeContext(gremlin, request);\n\n switch (request.mode) {\n case \"Outer\":\n gremlin += '.Has(\"ParentUUID\", \"\")';\n break;\n case \"Inner\":\n gremlin += '.Has(\"ParentUUID\", Ne(\"\"))';\n break;\n }\n\n if (request.dedup && request.dedup != '---') {\n gremlin += '.Dedup(\"' + request.dedup + '\")';\n }\n\n gremlin += '.Metrics()';\n\n if (request.aggregates) {\n gremlin += '.Aggregates()';\n }\n\n return {gremlin: gremlin, request: request};\n }\n\n doQueries(queries) {\n return _.map(queries, query => {\n return this.doQuery(query);\n });\n }\n\n doQuery(query) {\n console.log(query.gremlin);\n\n return this.doGremlinQuery(query.gremlin).then(result => {\n var data = [];\n if (result.status !== 200) {\n return data;\n }\n\n if (result.data.length <= 0) {\n return data;\n }\n\n _.forEach(result.data[0], (metrics, uuid) => {\n var datapoints = _.map(metrics, metric => {\n var value = 0;\n switch (query.request.field) {\n case \"Bytes\":\n // flow or interface metrics ?\n if (_.has(metric, \"ABBytes\")) {\n value = metric.ABBytes + metric.BABytes;\n } else {\n value = metric.RxBytes + metric.RxBytes;\n }\n break;\n case \"Packets\":\n // flow or interface metrics ?\n if (_.has(metric, \"ABPackets\")) {\n value = metric.ABPackets + metric.BAPackets;\n } else {\n value = metric.RxPackets + metric.TxPackets;\n }\n break;\n default:\n value = metric[query.request.field];\n }\n var start = metric.Start;\n var last = metric.Last;\n\n if (this.version != \"0.9\") {\n start /= 1000;\n last /= 1000;\n }\n return [value / (last - start), moment(last, 'X').valueOf()];\n });\n\n data.push({\n target: query.request.title || uuid,\n datapoints: _.toArray(datapoints).reverse()\n });\n });\n\n return data;\n });\n }\n\n doGremlinQuery(gremlin) {\n var options = {\n url: this.url + '/api/topology',\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n data: {'GremlinQuery': gremlin}\n };\n return this.backendSrv.datasourceRequest(options);\n }\n\n // Required\n // Used for testing datasource in datasource configuration pange\n testDatasource() {\n return this.backendSrv.datasourceRequest({\n url: this.url + '/api',\n method: 'GET'\n }).then(response => {\n if (response.status === 200) {\n return { status: \"success\", message: \"Data source is working\", title: \"Success\" };\n }\n });\n }\n}\n"],"file":"datasource.js"} \ No newline at end of file +{"version":3,"sources":["../src/datasource.js"],"names":["_","moment","SemverCmp","SkydiveDatasource","instanceSettings","$q","backendSrv","templateSrv","console","log","type","url","name","version","jsonData","q","options","targets","filter","target","hide","gremlin","length","when","data","queries","map","targetToQuery","range","from","format","to","promises","doQueries","all","then","results","flatten","title","field","metricField","dedup","aggregates","mode","refId","requestToQuery","targetToRequest","request","replace","gremlinTimeContext","query","doQuery","doGremlinQuery","result","status","forEach","metrics","uuid","datapoints","metric","value","has","ABBytes","BABytes","RxBytes","ABPackets","BAPackets","RxPackets","TxPackets","start","Start","last","Last","valueOf","push","toArray","reverse","catch","err","message","method","headers","datasourceRequest","response","msg","statusText"],"mappings":"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","sourcesContent":["import _ from \"lodash\";\nimport moment from \"moment\";\nimport { SemverCmp } from \"./semver\";\n\nexport class SkydiveDatasource {\n\n /** @ngInject **/\n constructor(instanceSettings, $q, backendSrv, templateSrv) {\n console.log(instanceSettings);\n this.type = instanceSettings.type;\n this.url = instanceSettings.url;\n this.name = instanceSettings.name;\n this.version = instanceSettings.jsonData.version;\n this.q = $q;\n this.backendSrv = backendSrv;\n this.templateSrv = templateSrv;\n }\n\n // Called once per panel (graph)\n query(options) {\n var targets = _.filter(options.targets, target => {\n return !target.hide && target.gremlin && target.gremlin !== 'Gremlin query';\n });\n\n if (targets.length <= 0) {\n return this.q.when({ data: [] });\n }\n\n var queries = _.map(targets, target => {\n return this.targetToQuery(target, options.range.from.format('X'), options.range.to.format('X'));\n });\n\n var promises = this.doQueries(queries);\n return this.q.all(promises).then(function (results) {\n return { data: _.flatten(results) };\n });\n }\n\n targetToRequest(target, from, to) {\n return {\n title: target.title || \"\",\n gremlin: target.gremlin || \"\",\n field: target.metricField,\n dedup: target.dedup,\n aggregates: target.aggregates,\n mode: target.mode,\n from: from,\n to: to,\n refId: target.refId,\n hide: target.hide\n };\n }\n\n targetToQuery(target, from, to) {\n return this.requestToQuery(this.targetToRequest(target, from, to));\n }\n\n gremlinTimeContext(gremlin, request) {\n if (SemverCmp(this.version, \"0.9\") == 0) {\n gremlin = gremlin.replace(/^G\\./i, 'G.At(' + request.to + ').');\n gremlin = gremlin.replace(/\\.Flows\\([^)]*\\)/i, '.Flows(Since(' + (request.to - request.from) + '))');\n } else {\n gremlin = gremlin.replace(/^G\\./i, 'G.At(' + request.to + ',' + (request.to - request.from) + ').');\n }\n\n return gremlin;\n }\n\n requestToQuery(request) {\n // removing Context/At and Metric from the original query if present\n var gremlin = request.gremlin.replace(/^G\\.At\\([^)]*\\)/i, 'G');\n gremlin = request.gremlin.replace(/^G\\.Context\\([^)]*\\)/i, 'G');\n gremlin = gremlin.replace(/\\.Metrics\\([^)]*\\)/i, '');\n gremlin = gremlin.replace(/\\.Aggregates\\([^)]*\\)/i, '');\n gremlin = gremlin.replace(/\\.Dedup\\([^)]*\\)/i, '');\n\n // add time context\n gremlin = this.gremlinTimeContext(gremlin, request);\n\n switch (request.mode) {\n case \"Outer\":\n gremlin += '.Has(\"ParentUUID\", \"\")';\n break;\n case \"Inner\":\n gremlin += '.Has(\"ParentUUID\", Ne(\"\"))';\n break;\n }\n\n if (request.dedup && request.dedup != '---') {\n gremlin += '.Dedup(\"' + request.dedup + '\")';\n }\n\n gremlin += '.Metrics()';\n\n if (request.aggregates) {\n gremlin += '.Aggregates()';\n }\n\n return { gremlin: gremlin, request: request };\n }\n\n doQueries(queries) {\n return _.map(queries, query => {\n return this.doQuery(query);\n });\n }\n\n doQuery(query) {\n console.log(query.gremlin);\n\n return this.doGremlinQuery(query.gremlin).then(result => {\n var data = [];\n if (result.status !== 200) {\n return data;\n }\n\n if (result.data.length <= 0) {\n return data;\n }\n\n _.forEach(result.data[0], (metrics, uuid) => {\n var datapoints = _.map(metrics, metric => {\n var value = 0;\n switch (query.request.field) {\n case \"Bytes\":\n // flow or interface metrics ?\n if (_.has(metric, \"ABBytes\")) {\n value = metric.ABBytes + metric.BABytes;\n } else {\n value = metric.RxBytes + metric.RxBytes;\n }\n break;\n case \"Packets\":\n // flow or interface metrics ?\n if (_.has(metric, \"ABPackets\")) {\n value = metric.ABPackets + metric.BAPackets;\n } else {\n value = metric.RxPackets + metric.TxPackets;\n }\n break;\n default:\n value = metric[query.request.field];\n }\n var start = metric.Start;\n var last = metric.Last;\n\n if (SemverCmp(this.version, \"0.9\") > 0) {\n start /= 1000;\n last /= 1000;\n }\n return [value / (last - start), moment(last, 'X').valueOf()];\n });\n\n data.push({\n target: query.request.title || uuid,\n datapoints: _.toArray(datapoints).reverse()\n });\n });\n\n return data;\n }).catch(err => {\n throw { message: err.data };\n });\n }\n\n doGremlinQuery(gremlin) {\n var options = {\n url: this.url + '/api/topology',\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n data: { 'GremlinQuery': gremlin }\n };\n return this.backendSrv.datasourceRequest(options);\n }\n\n // Required\n // Used for testing datasource in datasource configuration pange\n testDatasource() {\n var request = {\n url: this.url + '/api',\n method: 'GET'\n };\n\n if (SemverCmp(this.version, \"0.9\") > 0) {\n request = {\n url: this.url + '/api/topology',\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n data: { 'GremlinQuery': \"G.At('-1s').V().Limit(1)\" }\n };\n }\n\n return this.backendSrv.datasourceRequest(request).then(response => {\n if (response.status === 200) {\n return { status: \"success\", message: \"Data source is working\", title: \"Success\" };\n }\n }).catch(err => {\n var msg = err.status + \" - \" + err.statusText;\n if (err.data.length > 0) {\n msg += \" : \" + err.data;\n }\n\n throw { message: msg };\n });\n }\n}\n"],"file":"datasource.js"} \ No newline at end of file diff --git a/dist/module.js.map b/dist/module.js.map index 57b91ed..5c1fd9b 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/module.js"],"names":["SkydiveDatasource","SkydiveConfigCtrl","SkydiveDatasourceQueryCtrl","SkydiveQueryOptionsCtrl","templateUrl"],"mappings":";;;;;;;;;;;AAAQA,MAAAA,iB,eAAAA,iB;;AACAC,MAAAA,iB,gBAAAA,iB;;AACAC,MAAAA,0B,eAAAA,0B;;;kCAEFC,uB;;;;AACNA,MAAAA,uBAAuB,CAACC,WAAxB,GAAsC,6BAAtC;;4BAGEJ,iB;;2BACAE,0B;;4BACAD,iB","sourcesContent":["import {SkydiveDatasource} from './datasource';\nimport {SkydiveConfigCtrl} from './config_ctrl';\nimport {SkydiveDatasourceQueryCtrl} from './query_ctrl';\n\nclass SkydiveQueryOptionsCtrl {}\nSkydiveQueryOptionsCtrl.templateUrl = 'partials/query.options.html';\n\nexport {\n SkydiveDatasource as Datasource,\n SkydiveDatasourceQueryCtrl as QueryCtrl,\n SkydiveConfigCtrl as ConfigCtrl,\n SkydiveQueryOptionsCtrl as QueryOptionsCtrl\n};\n"],"file":"module.js"} \ No newline at end of file +{"version":3,"sources":["../src/module.js"],"names":["SkydiveDatasource","SkydiveConfigCtrl","SkydiveDatasourceQueryCtrl","SkydiveQueryOptionsCtrl","templateUrl"],"mappings":";;;;;;;;;;;AAASA,MAAAA,iB,eAAAA,iB;;AACAC,MAAAA,iB,gBAAAA,iB;;AACAC,MAAAA,0B,eAAAA,0B;;;kCAEHC,uB;;;;AACNA,MAAAA,uBAAuB,CAACC,WAAxB,GAAsC,6BAAtC;;4BAGEJ,iB;;2BACAE,0B;;4BACAD,iB","sourcesContent":["import { SkydiveDatasource } from './datasource';\nimport { SkydiveConfigCtrl } from './config_ctrl';\nimport { SkydiveDatasourceQueryCtrl } from './query_ctrl';\n\nclass SkydiveQueryOptionsCtrl { }\nSkydiveQueryOptionsCtrl.templateUrl = 'partials/query.options.html';\n\nexport {\n SkydiveDatasource as Datasource,\n SkydiveDatasourceQueryCtrl as QueryCtrl,\n SkydiveConfigCtrl as ConfigCtrl,\n SkydiveQueryOptionsCtrl as QueryOptionsCtrl\n};\n"],"file":"module.js"} \ No newline at end of file diff --git a/dist/plugin.json b/dist/plugin.json index ff0c11f..46a184f 100644 --- a/dist/plugin.json +++ b/dist/plugin.json @@ -2,12 +2,9 @@ "name": "Skydive", "id": "skydive-datasource", "type": "datasource", - "staticRoot": ".", - "metrics": true, "annotations": false, - "info": { "description": "Skydive datasource", "author": { @@ -19,15 +16,20 @@ "large": "img/skydive-logo.png" }, "links": [ - {"name": "GitHub", "url": "https://github.com/skydive-project/skydive-grafana-datasource"}, - {"name": "MIT License", "url": "https://github.com/skydive-project/skydive-grafana-datasource/blob/master/LICENSE"} + { + "name": "GitHub", + "url": "https://github.com/skydive-project/skydive-grafana-datasource" + }, + { + "name": "MIT License", + "url": "https://github.com/skydive-project/skydive-grafana-datasource/blob/master/LICENSE" + } ], - "version": "1.1.0", - "updated": "2017-08-10" + "version": "1.2.0", + "updated": "2019-03-29" }, - "dependencies": { "grafanaVersion": "3.x.x", - "plugins": [ ] + "plugins": [] } -} +} \ No newline at end of file diff --git a/dist/query_ctrl.js b/dist/query_ctrl.js index 4b1dd67..aa8505a 100644 --- a/dist/query_ctrl.js +++ b/dist/query_ctrl.js @@ -1,9 +1,9 @@ "use strict"; -System.register(["app/plugins/sdk", "./css/query-editor.css!"], function (_export, _context) { +System.register(["app/plugins/sdk", "app/core/app_events", "./css/query-editor.css!"], function (_export, _context) { "use strict"; - var QueryCtrl, SkydiveDatasourceQueryCtrl; + var QueryCtrl, appEvents, SkydiveDatasourceQueryCtrl; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -26,6 +26,8 @@ System.register(["app/plugins/sdk", "./css/query-editor.css!"], function (_expor return { setters: [function (_appPluginsSdk) { QueryCtrl = _appPluginsSdk.QueryCtrl; + }, function (_appCoreApp_events) { + appEvents = _appCoreApp_events.default; }, function (_cssQueryEditorCss) {}], execute: function () { _export("SkydiveDatasourceQueryCtrl", SkydiveDatasourceQueryCtrl = @@ -65,15 +67,12 @@ System.register(["app/plugins/sdk", "./css/query-editor.css!"], function (_expor }, { text: "ParentUUID", value: "ParentUUID" + }, { + text: "L3TrackingID", + value: "L3TrackingID" }, { text: "NodeTID", value: "NodeTID" - }, { - text: "ANodeTID", - value: "ANodeTID" - }, { - text: "BNodeTID", - value: "BNodeTID" }]; _this.dedupIntf = [{ text: "---", @@ -209,6 +208,14 @@ System.register(["app/plugins/sdk", "./css/query-editor.css!"], function (_expor _this2.prevMode = _this2.target.mode; _this2.panelCtrl.refresh(); + }).catch(function (err) { + var msg = err.status + " - " + err.statusText; + + if (err.data.length > 0) { + msg += " : " + err.data; + } + + appEvents.emit('alert-error', ['Error', msg]); }); } } diff --git a/dist/query_ctrl.js.map b/dist/query_ctrl.js.map index 2438e13..05e24bd 100644 --- a/dist/query_ctrl.js.map +++ b/dist/query_ctrl.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/query_ctrl.js"],"names":["QueryCtrl","SkydiveDatasourceQueryCtrl","$scope","$injector","uiSegmentSrv","scope","metricType","target","metricField","metricFields","metricTypeFields","dedupFlow","text","value","dedupIntf","dedup","aggregates","mode","prevWorked","prevTitle","prevGremlin","prevMetricField","prevDedup","prevAggregates","prevMode","onChangeInternal","gremlin","range","panelCtrl","query","datasource","targetToQuery","title","q","from","format","to","doGremlinQuery","then","result","status","data","length","_","forEach","metrics","uuid","metric","forOwn","key","k","push","refresh","templateUrl"],"mappings":"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","sourcesContent":["import {QueryCtrl} from 'app/plugins/sdk';\nimport './css/query-editor.css!'\n\nexport class SkydiveDatasourceQueryCtrl extends QueryCtrl {\n\n /** @ngInject */\n constructor($scope, $injector, uiSegmentSrv) {\n super($scope, $injector);\n\n this.scope = $scope;\n this.uiSegmentSrv = uiSegmentSrv;\n\n // set visibility of some field depending on the type of metrics returned\n this.metricType = 'interface';\n\n this.target.metricField = this.target.metricField || \"Bytes\";\n\n this.metricFields = [];\n this.metricTypeFields = {\n \"interface\": [\n 'Bytes',\n 'Packets',\n 'Collisions',\n 'Multicast',\n 'RxBytes',\n 'RxCompressed',\n 'RxCrcErrors',\n 'RxDropped',\n 'RxErrors',\n 'RxFifoErrors',\n 'RxFrameErrors',\n 'RxLengthErrors',\n 'RxMissedErrors',\n 'RxOverErrors',\n 'RxPackets',\n 'TxAbortedErrors',\n 'TxBytes',\n 'TxCarrierErrors',\n 'TxCompressed',\n 'TxDropped',\n 'TxErrors',\n 'TxFifoErrors',\n 'TxHeartbeatErrors',\n 'TxPackets',\n 'TxWindowErrors'\n ],\n \"flow\": [\n 'Bytes',\n 'Packets',\n 'ABPackets',\n 'ABBytes',\n 'BAPackets',\n 'BABytes'\n ]\n };\n\n this.dedupFlow = [\n {text: \"---\", value: \"---\"},\n {text: \"LayersPath\", value: \"LayersPath\"},\n {text: \"Application\", value: \"Application\"},\n {text: \"TrackingID\", value: \"TrackingID\"},\n {text: \"ParentUUID\", value: \"ParentUUID\"},\n {text: \"NodeTID\", value: \"NodeTID\"},\n {text: \"ANodeTID\", value: \"ANodeTID\"},\n {text: \"BNodeTID\", value: \"BNodeTID\"}\n ];\n\n this.dedupIntf = [\n {text: \"---\", value: \"---\"},\n {text: \"ID\", value: \"ID\"},\n {text: \"TID\", value: \"TID\"},\n {text: \"Type\", value: \"Type\"}\n ];\n\n this.target.dedup = this.target.dedup || \"---\";\n this.dedup = this.dedupFlow;\n\n this.target.aggregates = this.target.aggregates || false;\n\n this.target.mode = this.target.mode || \"All\";\n this.mode = [\n {text: \"All\", value: \"All\"},\n {text: \"Outer only\", value: \"Outer\"},\n {text: \"Inner only\", value: \"Inner\"}\n ];\n\n this.prevWorked = false;\n this.prevTitle = \"\";\n this.prevGremlin = \"\";\n this.prevMetricField = this.metricField;\n this.prevDedup = this.dedup;\n this.prevAggregates = this.aggregates;\n this.prevMode = this.mode;\n\n this.onChangeInternal();\n }\n\n getCollapsedText() {\n return this.target.gremlin;\n }\n\n onChangeInternal() {\n var range = this.panelCtrl.range;\n\n var query = this.datasource.targetToQuery(this.target, 1, 2);\n\n if (!this.prevWorked || this.prevGremlin !== query.gremlin || this.prevMetricField != this.target.metricField ||\n this.prevAggregates != this.target.aggregates || this.prevMode != this.target.mode ||\n this.prevTitle != this.target.title) {\n\n this.prevWorked = false;\n\n // flow metrics ?\n var metricType = this.metricType;\n\n var target = {\n gremlin: this.target.gremlin\n };\n\n var q = this.datasource.targetToQuery(target, range.from.format('X'), range.to.format('X'));\n this.datasource.doGremlinQuery(q.gremlin).then(result => {\n if (result.status === 200 && result.data.length > 0) {\n this.prevWorked = true;\n\n this.metricFields = [];\n this.prevMetricField = this.target.metricField;\n\n _.forEach(result.data[0], (metrics, uuid) => {\n _.forEach(metrics, metric => {\n _.forOwn(metric, (value, key) => {\n if (key === \"ABBytes\" || key === \"BABytes\") {\n metricType = \"flow\";\n return false;\n } else if (key === \"RxPackets\" || key === \"TxPackets\") {\n metricType = \"interface\";\n return false;\n }\n });\n\n return false;\n });\n return false;\n });\n }\n\n for (let k of this.metricTypeFields[metricType]) {\n this.metricFields.push({text: k, value: k});\n }\n\n if (metricType === \"flow\") {\n this.dedup = this.dedupFlow;\n } else {\n this.dedup = this.dedupIntf;\n }\n if (this.metricType != metricType) {\n this.metricType = metricType;\n\n // reset the metricField as we changed of type of metrics\n this.target.metricField = \"Bytes\";\n }\n\n this.prevTitle = this.target.title;\n this.prevGremlin = query.gremlin;\n this.prevMetricField = this.target.metricField;\n this.prevDedup = this.target.dedup;\n this.prevAggregates = this.target.aggregates;\n this.prevMode = this.target.mode;\n\n this.panelCtrl.refresh();\n });\n }\n }\n}\n\nSkydiveDatasourceQueryCtrl.templateUrl = 'partials/query.editor.html';\n"],"file":"query_ctrl.js"} \ No newline at end of file +{"version":3,"sources":["../src/query_ctrl.js"],"names":["QueryCtrl","appEvents","SkydiveDatasourceQueryCtrl","$scope","$injector","uiSegmentSrv","scope","metricType","target","metricField","metricFields","metricTypeFields","dedupFlow","text","value","dedupIntf","dedup","aggregates","mode","prevWorked","prevTitle","prevGremlin","prevMetricField","prevDedup","prevAggregates","prevMode","onChangeInternal","gremlin","range","panelCtrl","query","datasource","targetToQuery","title","q","from","format","to","doGremlinQuery","then","result","status","data","length","_","forEach","metrics","uuid","metric","forOwn","key","k","push","refresh","catch","err","msg","statusText","emit","templateUrl"],"mappings":"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","sourcesContent":["import { QueryCtrl } from 'app/plugins/sdk';\nimport appEvents from 'app/core/app_events';\nimport './css/query-editor.css!'\n\nexport class SkydiveDatasourceQueryCtrl extends QueryCtrl {\n\n /** @ngInject */\n constructor($scope, $injector, uiSegmentSrv) {\n super($scope, $injector);\n\n this.scope = $scope;\n this.uiSegmentSrv = uiSegmentSrv;\n\n // set visibility of some field depending on the type of metrics returned\n this.metricType = 'interface';\n\n this.target.metricField = this.target.metricField || \"Bytes\";\n\n this.metricFields = [];\n this.metricTypeFields = {\n \"interface\": [\n 'Bytes',\n 'Packets',\n 'Collisions',\n 'Multicast',\n 'RxBytes',\n 'RxCompressed',\n 'RxCrcErrors',\n 'RxDropped',\n 'RxErrors',\n 'RxFifoErrors',\n 'RxFrameErrors',\n 'RxLengthErrors',\n 'RxMissedErrors',\n 'RxOverErrors',\n 'RxPackets',\n 'TxAbortedErrors',\n 'TxBytes',\n 'TxCarrierErrors',\n 'TxCompressed',\n 'TxDropped',\n 'TxErrors',\n 'TxFifoErrors',\n 'TxHeartbeatErrors',\n 'TxPackets',\n 'TxWindowErrors'\n ],\n \"flow\": [\n 'Bytes',\n 'Packets',\n 'ABPackets',\n 'ABBytes',\n 'BAPackets',\n 'BABytes'\n ]\n };\n\n this.dedupFlow = [\n { text: \"---\", value: \"---\" },\n { text: \"LayersPath\", value: \"LayersPath\" },\n { text: \"Application\", value: \"Application\" },\n { text: \"TrackingID\", value: \"TrackingID\" },\n { text: \"ParentUUID\", value: \"ParentUUID\" },\n { text: \"L3TrackingID\", value: \"L3TrackingID\" },\n { text: \"NodeTID\", value: \"NodeTID\" }\n ];\n\n this.dedupIntf = [\n { text: \"---\", value: \"---\" },\n { text: \"ID\", value: \"ID\" },\n { text: \"TID\", value: \"TID\" },\n { text: \"Type\", value: \"Type\" }\n ];\n\n this.target.dedup = this.target.dedup || \"---\";\n this.dedup = this.dedupFlow;\n\n this.target.aggregates = this.target.aggregates || false;\n\n this.target.mode = this.target.mode || \"All\";\n this.mode = [\n { text: \"All\", value: \"All\" },\n { text: \"Outer only\", value: \"Outer\" },\n { text: \"Inner only\", value: \"Inner\" }\n ];\n\n this.prevWorked = false;\n this.prevTitle = \"\";\n this.prevGremlin = \"\";\n this.prevMetricField = this.metricField;\n this.prevDedup = this.dedup;\n this.prevAggregates = this.aggregates;\n this.prevMode = this.mode;\n\n this.onChangeInternal();\n }\n\n getCollapsedText() {\n return this.target.gremlin;\n }\n\n onChangeInternal() {\n var range = this.panelCtrl.range;\n\n var query = this.datasource.targetToQuery(this.target, 1, 2);\n\n if (!this.prevWorked || this.prevGremlin !== query.gremlin || this.prevMetricField != this.target.metricField ||\n this.prevAggregates != this.target.aggregates || this.prevMode != this.target.mode ||\n this.prevTitle != this.target.title) {\n\n this.prevWorked = false;\n\n // flow metrics ?\n var metricType = this.metricType;\n\n var target = {\n gremlin: this.target.gremlin\n };\n\n var q = this.datasource.targetToQuery(target, range.from.format('X'), range.to.format('X'));\n this.datasource.doGremlinQuery(q.gremlin).then(result => {\n if (result.status === 200 && result.data.length > 0) {\n this.prevWorked = true;\n\n this.metricFields = [];\n this.prevMetricField = this.target.metricField;\n\n _.forEach(result.data[0], (metrics, uuid) => {\n _.forEach(metrics, metric => {\n _.forOwn(metric, (value, key) => {\n if (key === \"ABBytes\" || key === \"BABytes\") {\n metricType = \"flow\";\n return false;\n } else if (key === \"RxPackets\" || key === \"TxPackets\") {\n metricType = \"interface\";\n return false;\n }\n });\n\n return false;\n });\n return false;\n });\n }\n\n for (let k of this.metricTypeFields[metricType]) {\n this.metricFields.push({ text: k, value: k });\n }\n\n if (metricType === \"flow\") {\n this.dedup = this.dedupFlow;\n } else {\n this.dedup = this.dedupIntf;\n }\n if (this.metricType != metricType) {\n this.metricType = metricType;\n\n // reset the metricField as we changed of type of metrics\n this.target.metricField = \"Bytes\";\n }\n\n this.prevTitle = this.target.title;\n this.prevGremlin = query.gremlin;\n this.prevMetricField = this.target.metricField;\n this.prevDedup = this.target.dedup;\n this.prevAggregates = this.target.aggregates;\n this.prevMode = this.target.mode;\n\n this.panelCtrl.refresh();\n }).catch(err => {\n var msg = err.status + \" - \" + err.statusText;\n if (err.data.length > 0) {\n msg += \" : \" + err.data;\n }\n\n appEvents.emit('alert-error', ['Error', msg]);\n });\n }\n }\n}\n\nSkydiveDatasourceQueryCtrl.templateUrl = 'partials/query.editor.html';\n"],"file":"query_ctrl.js"} \ No newline at end of file diff --git a/package.json b/package.json index 1a174ec..7ffa56f 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "devDependencies": { "@babel/core": "^7.4.0", "@babel/plugin-transform-for-of": "^7.4.0", + "@babel/plugin-transform-modules-commonjs": "^7.4.0", "@babel/plugin-transform-modules-systemjs": "^7.4.0", "@babel/preset-env": "^7.4.2", "@babel/register": "^7.4.0", diff --git a/spec/datasource_spec.js b/spec/datasource_spec.js index df77f97..6160d28 100644 --- a/spec/datasource_spec.js +++ b/spec/datasource_spec.js @@ -1,46 +1,46 @@ -import {Datasource} from "../module"; +import { Datasource } from "../module"; import _ from "lodash"; import moment from "moment"; import Q from "q"; -describe('SkydiveDatasource', function() { +describe('SkydiveDatasource', function () { var ctx = {}; - beforeEach(function() { + beforeEach(function () { ctx.$q = Q; ctx.backendSrv = {}; ctx.templateSrv = {}; - ctx.ds = new Datasource({jsonData:{version: "0.10"}}, ctx.$q, ctx.backendSrv, ctx.templateSrv); + ctx.ds = new Datasource({ jsonData: { version: "0.10" } }, ctx.$q, ctx.backendSrv, ctx.templateSrv); }); - it('should return an empty array when no targets are set', function(done) { - ctx.ds.query({targets: []}).then(function(result) { + it('should return an empty array when no targets are set', function (done) { + ctx.ds.query({ targets: [] }).then(function (result) { expect(result.data).to.have.length(0); done(); }); }); - it('should return the server results when a target is set', function(done) { - ctx.backendSrv.datasourceRequest = function(request) { - expect(request.data).to.eql({"GremlinQuery": 'G.At(1,1).Flows().Has("ParentUUID", "").Dedup("NodeTID").Metrics()'}); + it('should return the server results when a target is set', function (done) { + ctx.backendSrv.datasourceRequest = function (request) { + expect(request.data).to.eql({ "GremlinQuery": 'G.At(1,1).Flows().Has("ParentUUID", "").Dedup("NodeTID").Metrics()' }); return ctx.$q.when({ status: 200, data: [{ - "1a7d0b9e56bd294ba27fe57e40359ccd14381832":[ - {"Start": 1481295511, "Last": 1481295521, "ABPackets": 2, "ABBytes": 84, "BAPackets": 2, "BABytes": 84}, - {"Start": 1481295521, "Last": 1481295531, "ABPackets": 1, "ABBytes": 42, "BAPackets": 1, "BABytes": 42} + "1a7d0b9e56bd294ba27fe57e40359ccd14381832": [ + { "Start": 1481295511, "Last": 1481295521, "ABPackets": 2, "ABBytes": 84, "BAPackets": 2, "BABytes": 84 }, + { "Start": 1481295521, "Last": 1481295531, "ABPackets": 1, "ABBytes": 42, "BAPackets": 1, "BABytes": 42 } ], - "86f04793da537b012b9a527edf68ff151ecae38a":[ - {"Start": 1481295511, "Last": 1481295521, "ABPackets": 10, "ABBytes": 840, "BAPackets": 10, "BABytes": 840}, - {"Start": 1481295521, "Last": 1481295531, "ABPackets": 10, "ABBytes": 840, "BAPackets": 10, "BABytes": 840} + "86f04793da537b012b9a527edf68ff151ecae38a": [ + { "Start": 1481295511, "Last": 1481295521, "ABPackets": 10, "ABBytes": 840, "BAPackets": 10, "BABytes": 840 }, + { "Start": 1481295521, "Last": 1481295531, "ABPackets": 10, "ABBytes": 840, "BAPackets": 10, "BABytes": 840 } ] }] }); }; - ctx.templateSrv.replace = function(data) { + ctx.templateSrv.replace = function (data) { return data; }; @@ -55,7 +55,7 @@ describe('SkydiveDatasource', function() { var from = moment(0, 'X'); var to = moment(1, 'X'); - ctx.ds.query({targets: targets, "range": {"from": from, "to": to}}).then(function(result) { + ctx.ds.query({ targets: targets, "range": { "from": from, "to": to } }).then(function (result) { expect(result.data).to.have.length(2); _.forEach(result.data, (serie, uuid) => { diff --git a/spec/test-main.js b/spec/test-main.js index e5d7d7c..8577427 100644 --- a/spec/test-main.js +++ b/spec/test-main.js @@ -1,5 +1,5 @@ import prunk from 'prunk'; -import {JSDOM} from 'jsdom'; +import { JSDOM } from 'jsdom'; import chai from 'chai'; // Mock Grafana modules that are not available outside of the core project @@ -8,6 +8,7 @@ prunk.mock('./css/query-editor.css!', 'no css, dude.'); prunk.mock('app/plugins/sdk', { QueryCtrl: null }); +prunk.mock('app/core/app_events', {}); // Setup jsdom // Required for loading angularjs diff --git a/src/config_ctrl.js b/src/config_ctrl.js index 799a16b..db1613c 100644 --- a/src/config_ctrl.js +++ b/src/config_ctrl.js @@ -5,8 +5,9 @@ export class SkydiveConfigCtrl { this.scope = $scope; this.versionFields = [ - { text: ">= 0.10.x", value: "0.10" }, - { text: "0.9.x", value: "0.9" } + { text: ">= 0.22", value: "0.22" }, + { text: ">= 0.10", value: "0.10" }, + { text: "0.9", value: "0.9" } ]; this.current.jsonData.version = this.current.jsonData.version || this.versionFields[0].value; diff --git a/src/datasource.js b/src/datasource.js index 7da3dd9..5958295 100644 --- a/src/datasource.js +++ b/src/datasource.js @@ -1,5 +1,6 @@ import _ from "lodash"; import moment from "moment"; +import { SemverCmp } from "./semver"; export class SkydiveDatasource { @@ -55,7 +56,7 @@ export class SkydiveDatasource { } gremlinTimeContext(gremlin, request) { - if (this.version == "0.9") { + if (SemverCmp(this.version, "0.9") == 0) { gremlin = gremlin.replace(/^G\./i, 'G.At(' + request.to + ').'); gremlin = gremlin.replace(/\.Flows\([^)]*\)/i, '.Flows(Since(' + (request.to - request.from) + '))'); } else { @@ -143,7 +144,7 @@ export class SkydiveDatasource { var start = metric.Start; var last = metric.Last; - if (this.version != "0.9") { + if (SemverCmp(this.version, "0.9") > 0) { start /= 1000; last /= 1000; } @@ -157,6 +158,8 @@ export class SkydiveDatasource { }); return data; + }).catch(err => { + throw { message: err.data }; }); } @@ -173,13 +176,31 @@ export class SkydiveDatasource { // Required // Used for testing datasource in datasource configuration pange testDatasource() { - return this.backendSrv.datasourceRequest({ + var request = { url: this.url + '/api', method: 'GET' - }).then(response => { + }; + + if (SemverCmp(this.version, "0.9") > 0) { + request = { + url: this.url + '/api/topology', + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: { 'GremlinQuery': "G.At('-1s').V().Limit(1)" } + }; + } + + return this.backendSrv.datasourceRequest(request).then(response => { if (response.status === 200) { return { status: "success", message: "Data source is working", title: "Success" }; } + }).catch(err => { + var msg = err.status + " - " + err.statusText; + if (err.data.length > 0) { + msg += " : " + err.data; + } + + throw { message: msg }; }); } } diff --git a/src/query_ctrl.js b/src/query_ctrl.js index 8b39da1..375fdb6 100644 --- a/src/query_ctrl.js +++ b/src/query_ctrl.js @@ -1,4 +1,5 @@ import { QueryCtrl } from 'app/plugins/sdk'; +import appEvents from 'app/core/app_events'; import './css/query-editor.css!' export class SkydiveDatasourceQueryCtrl extends QueryCtrl { @@ -166,6 +167,13 @@ export class SkydiveDatasourceQueryCtrl extends QueryCtrl { this.prevMode = this.target.mode; this.panelCtrl.refresh(); + }).catch(err => { + var msg = err.status + " - " + err.statusText; + if (err.data.length > 0) { + msg += " : " + err.data; + } + + appEvents.emit('alert-error', ['Error', msg]); }); } } diff --git a/src/semver.js b/src/semver.js new file mode 100644 index 0000000..78b1123 --- /dev/null +++ b/src/semver.js @@ -0,0 +1,30 @@ + +export function SemverCmp(v1, v2) { + if (v1 === v2) { + return 0; + } + + var v1_els = v1.split("."); + var v2_els = v2.split("."); + + var len = Math.min(v1_els.length, v2_els.length); + for (var i = 0; i < len; i++) { + if (parseInt(v1_els[i]) > parseInt(v2_els[i])) { + return 1; + } + + if (parseInt(v1_els[i]) < parseInt(v2_els[i])) { + return -1; + } + } + + if (v1_els.length > v2_els.length) { + return 1; + } + + if (v1_els.length < v2_els.length) { + return -1; + } + + return 0; +} \ No newline at end of file