Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 915c5f9

Browse files
DanCechutkarshcmu
authored andcommitted
add support for using bearer token with import/export dashboards
1 parent 277bdcb commit 915c5f9

File tree

3 files changed

+97
-60
lines changed

3 files changed

+97
-60
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"request": "^2.83.0",
3535
"aws-sdk": "^2.133.0",
3636
"png-file-stream": "^1.0.0",
37-
"sync-request": "^4.0.1"
37+
"sync-request": "^4.1.0"
3838
},
3939
"devDependencies": {
4040
"chai": "^4.1.2",

src/remote/grafana/exportSrv.js

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -163,22 +163,45 @@ ExportSrv.prototype.dashboard = function(grafanaURL, options, dashboardName) {
163163
};
164164

165165
ExportSrv.prototype.dashboards = function(grafanaURL, options) {
166-
var dashNames = components.readEntityNamesFromDir('dashboards');
167-
options.url = createURL(grafanaURL, 'dashboard-search');
166+
var output = '';
168167
var failed = 0;
169168
var success = 0;
170-
var method = 'POST';
171-
request.get(options, function saveHandler(error_check, response_check, body_check) {
172-
// Getting existing list of datasources and making a mapping of names to ids
169+
170+
options.url = createURL(grafanaURL, 'dashboard-search');
171+
172+
request.get(options, function saveHandler(error, response, body) {
173+
if (error || response.statusCode !== 200) {
174+
output += 'Grafana API response status code = ' + response.statusCode;
175+
if (error === null) {
176+
output += '\nNo error body from Grafana API.';
177+
}
178+
else {
179+
output += '\n' + error;
180+
}
181+
logger.showOutput(output);
182+
logger.showError('Error getting list of dashboards from Grafana');
183+
process.exit(1);
184+
}
185+
186+
// Getting existing list of dashboards and making a mapping of names to ids
173187
var dashSlugs = {};
174-
_.forEach(body_check, function(dashboard) {
188+
_.forEach(body, function(dashboard) {
175189
if (dashboard.type === 'dash-db') {
176190
//Removing "db/" from the uri
177191
dashSlugs[dashboard.uri.substring(3)] = dashboard.id;
178192
}
179193
});
194+
195+
var dashList = components.readEntityNamesFromDir('dashboards');
196+
logger.justShow('Exporting ' + dashList.length + ' dashboards:');
197+
198+
var headers = options.headers || {};
199+
if (options.auth.bearer) {
200+
headers.Authorization = 'Bearer ' + options.auth.bearer;
201+
}
202+
180203
// Here we try exporting (either updating or creating) a dashboard
181-
_.forEach(dashNames, function(dashboard) {
204+
_.forEach(dashList, function(dashboard) {
182205
var url = createURL(grafanaURL, 'dashboards');
183206
url = sanitizeUrl(url, options.auth);
184207
var body = {
@@ -194,28 +217,33 @@ ExportSrv.prototype.dashboards = function(grafanaURL, options) {
194217
body.overwrite = false;
195218
}
196219
// Use sync-request to avoid table lockdown
197-
var response = syncReq(method, url, {json: body, headers: options.headers });
198220
try {
199-
logger.showOutput(response.getBody('utf8'));
221+
var response = syncReq('POST', url, {json: body, headers: headers});
222+
try {
223+
logger.showOutput(response.getBody('utf8'));
224+
} catch (error) {
225+
logger.showOutput(response.body.toString('utf8'));
226+
}
227+
if (response.statusCode !== 200) {
228+
logger.showError('Dashboard ' + dashboard + ' export failed.');
229+
failed++;
230+
} else {
231+
logger.showResult('Dashboard ' + dashboard + ' exported successfully.');
232+
success++;
233+
}
200234
} catch (error) {
201-
logger.showOutput(response.body.toString('utf8'));
202-
}
203-
if (response.statusCode !== 200) {
204-
logger.showError('Dashboard ' + dashboard + ' export failed.');
235+
logger.showError('Dashboard ' + dashboard + ' export failed: ' + error);
205236
failed++;
206-
} else {
207-
logger.showResult('Dashboard ' + dashboard + ' exported successfully.');
208-
success++;
209237
}
210238
});
239+
211240
if (success > 0) {
212241
logger.showResult(success + ' dashboards exported successfully.');
213242
}
243+
214244
if (failed > 0) {
215245
logger.showError(failed + ' dashboards export failed.');
216246
process.exit(1);
217-
} else {
218-
process.exit(0);
219247
}
220248
});
221249
};
@@ -440,6 +468,7 @@ function createURL(grafanaURL, entityType, entityValue) {
440468
} else if (entityType === 'alerts') {
441469
grafanaURL += '/api/alert-notifications';
442470
}
471+
443472
return grafanaURL;
444473
}
445474

src/remote/grafana/importSrv.js

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -37,52 +37,18 @@ ImportSrv.prototype.dashboard = function(grafanaURL, options, dashboardName) {
3737
logger.showError(failureMessage);
3838
}
3939
});
40-
4140
};
4241

4342
ImportSrv.prototype.dashboards = function(grafanaURL, options) {
44-
var successMessage = 'Dashboards import successful.';
45-
var failureMessage = 'Dashboards import failed.';
4643
var output = '';
4744
var failed = 0;
4845
var success = 0;
49-
var method = 'GET';
46+
5047
options.url = createURL(grafanaURL, 'dashboards');
5148
options.json = true;
49+
5250
request.get(options, function saveHandler(error, response, body) {
53-
var dashList = [];
54-
if (!error && response.statusCode === 200) {
55-
_.each(body, function(dashboard) {
56-
dashList.push(dashboard.uri.substring(3)); //removing db/
57-
});
58-
logger.justShow('Importing ' + dashList.length + ' dashboards:');
59-
_.each(dashList, function(dash) {
60-
var url = createURL(grafanaURL, 'dashboard', dash);
61-
url = sanitizeUrl(url, options.auth);
62-
var response = syncReq(method, url, { headers: options.headers });
63-
try {
64-
if (response.statusCode === 200) {
65-
var dashResponse = JSON.parse(response.getBody('utf8'));
66-
components.dashboards.saveDashboard(dash, dashResponse.dashboard, false);
67-
logger.showResult(dash + ' imported successfully.');
68-
success++;
69-
}
70-
} catch (error) {
71-
logger.showResult(dash + ' import failed.');
72-
failed++;
73-
throw new Error();
74-
}
75-
});
76-
if (success > 0) {
77-
logger.showResult(success + ' dashboards imported successfully.');
78-
}
79-
if (failed > 0) {
80-
logger.showError(failed + ' dashboards import failed.');
81-
process.exit(1);
82-
} else {
83-
process.exit(0);
84-
}
85-
} else {
51+
if (error || response.statusCode !== 200) {
8652
output += 'Grafana API response status code = ' + response.statusCode;
8753
if (error === null) {
8854
output += '\nNo error body from Grafana API.';
@@ -91,14 +57,56 @@ ImportSrv.prototype.dashboards = function(grafanaURL, options) {
9157
output += '\n' + error;
9258
}
9359
logger.showOutput(output);
94-
logger.showError(failureMessage);
60+
logger.showError('Error getting list of dashboards from Grafana');
61+
process.exit(1);
62+
}
63+
64+
var dashList = [];
65+
_.forEach(body, function(dashboard) {
66+
dashList.push(dashboard.uri.substring(3)); //removing db/
67+
});
68+
logger.justShow('Importing ' + dashList.length + ' dashboards:');
69+
70+
var headers = options.headers || {};
71+
if (options.auth.bearer) {
72+
headers.Authorization = 'Bearer ' + options.auth.bearer;
73+
}
74+
75+
// Here we try importing a dashboard
76+
_.forEach(dashList, function(dashboard) {
77+
var url = createURL(grafanaURL, 'dashboard', dashboard);
78+
url = sanitizeUrl(url, options.auth);
79+
try {
80+
var response = syncReq('GET', url, { headers: headers});
81+
if (response.statusCode !== 200) {
82+
logger.showError('Dashboard ' + dashboard + ' import failed: ' + response.getBody('utf8'));
83+
failed++;
84+
} else {
85+
var dashResponse = JSON.parse(response.getBody('utf8'));
86+
components.dashboards.saveDashboard(dashboard, dashResponse.dashboard, false);
87+
logger.showResult('Dashboard ' + dashboard + ' imported successfully.');
88+
success++;
89+
}
90+
} catch (error) {
91+
logger.showError('Dashboard ' + dashboard + ' import failed: ' + error);
92+
failed++;
93+
}
94+
});
95+
96+
if (success > 0) {
97+
logger.showResult(success + ' dashboards imported successfully.');
98+
}
99+
100+
if (failed > 0) {
101+
logger.showError(failed + ' dashboards import failed.');
102+
process.exit(1);
95103
}
96104
});
97105
};
98106

99107
ImportSrv.prototype.org = function(grafanaURL, options, orgName) {
100108
var successMessage = 'Org '+ orgName + ' import successful.';
101-
var failureMessage = 'Org '+ orgName + ' import failed.';
109+
var failureMessage = 'Org '+ orgName + ' import failed.';
102110
var output = '';
103111
options.url = createURL(grafanaURL, 'org', orgName);
104112
options.json = true;
@@ -123,7 +131,7 @@ ImportSrv.prototype.org = function(grafanaURL, options, orgName) {
123131

124132
ImportSrv.prototype.orgs = function(grafanaURL, options) {
125133
var successMessage = 'Orgs import successful.';
126-
var failureMessage = 'Orgs import failed.';
134+
var failureMessage = 'Orgs import failed.';
127135
var output = '';
128136
options.url = createURL(grafanaURL, 'orgs');
129137
options.json = true;
@@ -185,7 +193,7 @@ ImportSrv.prototype.datasource = function(grafanaURL, options, datasourceName) {
185193

186194
ImportSrv.prototype.datasources = function(grafanaURL, options) {
187195
var successMessage = 'Datasources import successful.';
188-
var failureMessage = 'Datasources import failed.';
196+
var failureMessage = 'Datasources import failed.';
189197
var output = '';
190198
options.url = createURL(grafanaURL, 'datasources');
191199
options.json = true;

0 commit comments

Comments
 (0)