blob: 7f2fe7fbedffd5598b4d4f2c44c850d7a93eb8a4 [file] [log] [blame]
Iftekharul Islam99d199f2017-03-24 15:28:25 -05001/**
2 * API utilities service
3 *
4 * @module app/common/services/api-utils
5 * @exports APIUtils
6 * @name APIUtils
Iftekharul Islam99d199f2017-03-24 15:28:25 -05007 */
8
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07009window.angular && (function(angular) {
10 'use strict';
Andrew Geisslerd27bb132018-05-24 11:07:27 -070011 angular.module('app.common.services').factory('APIUtils', [
12 '$http', 'Constants', '$q', 'dataService',
13 function($http, Constants, $q, DataService) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070014 var getScaledValue = function(value, scale) {
15 scale = scale + '';
16 scale = parseInt(scale, 10);
17 var power = Math.abs(parseInt(scale, 10));
CamVan Nguyen33275832018-03-13 18:38:37 -050018
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070019 if (scale > 0) {
20 value = value * Math.pow(10, power);
Andrew Geisslerd27bb132018-05-24 11:07:27 -070021 } else if (scale < 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070022 value = value / Math.pow(10, power);
23 }
24 return value;
25 };
26 var SERVICE = {
27 API_CREDENTIALS: Constants.API_CREDENTIALS,
28 API_RESPONSE: Constants.API_RESPONSE,
29 CHASSIS_POWER_STATE: Constants.CHASSIS_POWER_STATE,
30 HOST_STATE_TEXT: Constants.HOST_STATE,
31 HOST_STATE: Constants.HOST_STATE,
32 LED_STATE: Constants.LED_STATE,
33 LED_STATE_TEXT: Constants.LED_STATE_TEXT,
34 HOST_SESSION_STORAGE_KEY: Constants.API_CREDENTIALS.host_storage_key,
35 getChassisState: function() {
36 var deferred = $q.defer();
37 $http({
38 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070039 url: DataService.getHost() +
40 '/xyz/openbmc_project/state/chassis0/attr/CurrentPowerState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070041 headers: {
42 'Accept': 'application/json',
43 'Content-Type': 'application/json'
44 },
45 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070046 })
47 .then(
48 function(response) {
49 var json = JSON.stringify(response.data);
50 var content = JSON.parse(json);
51 deferred.resolve(content.data);
52 },
53 function(error) {
54 console.log(error);
55 deferred.reject(error);
56 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070057 return deferred.promise;
58 },
Gunnar Mills65491142018-06-04 14:23:33 -050059 validIPV4IP: function(ip) {
60 // Checks for [0-255].[0-255].[0-255].[0-255]
61 return ip.match(
62 /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/);
63 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070064 getHostState: function() {
65 var deferred = $q.defer();
66 $http({
67 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070068 url: DataService.getHost() +
69 '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070070 headers: {
71 'Accept': 'application/json',
72 'Content-Type': 'application/json'
73 },
74 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070075 })
76 .then(
77 function(response) {
78 var json = JSON.stringify(response.data);
79 var content = JSON.parse(json);
80 deferred.resolve(content.data);
81 },
82 function(error) {
83 console.log(error);
84 deferred.reject(error);
85 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070086 return deferred.promise;
87 },
Gunnar Millsff64c542018-08-24 15:49:09 -050088 getSNMPManagers: function() {
89 return $http({
90 method: 'GET',
91 url: DataService.getHost() +
92 '/xyz/openbmc_project/network/snmp/manager/enumerate',
93 headers: {
94 'Accept': 'application/json',
95 'Content-Type': 'application/json'
96 },
97 withCredentials: true
98 })
99 .then(function(response) {
100 return response.data;
101 });
102 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700103 getNetworkInfo: function() {
104 var deferred = $q.defer();
105 $http({
106 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700107 url: DataService.getHost() +
108 '/xyz/openbmc_project/network/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700109 headers: {
110 'Accept': 'application/json',
111 'Content-Type': 'application/json'
112 },
113 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700114 })
115 .then(
116 function(response) {
117 var json = JSON.stringify(response.data);
118 var content = JSON.parse(json);
119 var hostname = '';
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500120 var defaultgateway = '';
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700121 var macAddress = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700122
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700123 function parseNetworkData(content) {
124 var data = {
125 interface_ids: [],
126 interfaces: {},
127 ip_addresses: {ipv4: [], ipv6: []},
128 };
129 var interfaceId = '', keyParts = [], interfaceHash = '',
130 interfaceType = '';
131 for (var key in content.data) {
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500132 if (key.match(/network\/eth\d+(_\d+)?$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700133 interfaceId = key.split('/').pop();
134 if (data.interface_ids.indexOf(interfaceId) == -1) {
135 data.interface_ids.push(interfaceId);
136 data.interfaces[interfaceId] = {
137 interfaceIname: '',
138 DomainName: '',
139 MACAddress: '',
140 Nameservers: [],
141 DHCPEnabled: 0,
142 ipv4: {ids: [], values: []},
143 ipv6: {ids: [], values: []}
144 };
145 data.interfaces[interfaceId].MACAddress =
146 content.data[key].MACAddress;
147 data.interfaces[interfaceId].DomainName =
148 content.data[key].DomainName.join(' ');
149 data.interfaces[interfaceId].Nameservers =
150 content.data[key].Nameservers;
151 data.interfaces[interfaceId].DHCPEnabled =
152 content.data[key].DHCPEnabled;
153 }
154 } else if (
155 key.match(
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500156 /network\/eth\d+(_\d+)?\/ipv[4|6]\/[a-z0-9]+$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700157 keyParts = key.split('/');
158 interfaceHash = keyParts.pop();
159 interfaceType = keyParts.pop();
160 interfaceId = keyParts.pop();
161
162 if (data.interfaces[interfaceId][interfaceType]
163 .ids.indexOf(interfaceHash) == -1) {
164 data.interfaces[interfaceId][interfaceType]
165 .ids.push(interfaceHash);
166 data.interfaces[interfaceId][interfaceType]
167 .values.push(content.data[key]);
168 data.ip_addresses[interfaceType].push(
169 content.data[key]['Address']);
170 }
171 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700172 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700173 return data;
174 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700175
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700176 if (content.data.hasOwnProperty(
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500177 '/xyz/openbmc_project/network/config')) {
178 if (content.data['/xyz/openbmc_project/network/config']
179 .hasOwnProperty('HostName')) {
180 hostname =
181 content.data['/xyz/openbmc_project/network/config']
182 .HostName;
183 }
184 if (content.data['/xyz/openbmc_project/network/config']
185 .hasOwnProperty('DefaultGateway')) {
186 defaultgateway =
187 content.data['/xyz/openbmc_project/network/config']
188 .DefaultGateway;
189 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700190 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700191
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700192 if (content.data.hasOwnProperty(
193 '/xyz/openbmc_project/network/eth0') &&
194 content.data['/xyz/openbmc_project/network/eth0']
195 .hasOwnProperty('MACAddress')) {
196 macAddress =
197 content.data['/xyz/openbmc_project/network/eth0']
198 .MACAddress;
199 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700200
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700201 deferred.resolve({
202 data: content.data,
203 hostname: hostname,
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500204 defaultgateway: defaultgateway,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700205 mac_address: macAddress,
206 formatted_data: parseNetworkData(content)
207 });
208 },
209 function(error) {
210 console.log(error);
211 deferred.reject(error);
212 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700213 return deferred.promise;
214 },
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500215 setMACAddress: function(interface_name, mac_address) {
216 return $http({
217 method: 'PUT',
218 url: DataService.getHost() +
219 '/xyz/openbmc_project/network/' + interface_name +
220 '/attr/MACAddress',
221 headers: {
222 'Accept': 'application/json',
223 'Content-Type': 'application/json'
224 },
225 withCredentials: true,
226 data: JSON.stringify({'data': mac_address})
227 })
228 .then(function(response) {
229 return response.data;
230 });
231 },
Gunnar Millsdca79d72018-05-30 13:07:01 -0500232 setDefaultGateway: function(defaultGateway) {
233 return $http({
234 method: 'PUT',
235 url: DataService.getHost() +
236 '/xyz/openbmc_project/network/config/attr/DefaultGateway',
237 headers: {
238 'Accept': 'application/json',
239 'Content-Type': 'application/json'
240 },
241 withCredentials: true,
242 data: JSON.stringify({'data': defaultGateway})
243 })
244 .then(function(response) {
245 return response.data;
246 });
247 },
Gunnar Millscb2c3062018-05-31 13:13:30 -0500248 setDHCPEnabled: function(interfaceName, dhcpEnabled) {
249 return $http({
250 method: 'PUT',
251 url: DataService.getHost() +
252 '/xyz/openbmc_project/network/' + interfaceName +
253 '/attr/DHCPEnabled',
254 headers: {
255 'Accept': 'application/json',
256 'Content-Type': 'application/json'
257 },
258 withCredentials: true,
259 data: JSON.stringify({'data': dhcpEnabled})
260 })
261 .then(function(response) {
262 return response.data;
263 });
264 },
Gunnar Mills06467822018-06-06 15:43:18 -0500265 setNameservers: function(interfaceName, dnsServers) {
266 return $http({
267 method: 'PUT',
268 url: DataService.getHost() +
269 '/xyz/openbmc_project/network/' + interfaceName +
270 '/attr/Nameservers',
271 headers: {
272 'Accept': 'application/json',
273 'Content-Type': 'application/json'
274 },
275 withCredentials: true,
276 data: JSON.stringify({'data': dnsServers})
277 })
278 .then(function(response) {
279 return response.data;
280 });
281 },
Gunnar Millsa45c3852018-05-30 16:18:45 -0500282 deleteIPV4: function(interfaceName, networkID) {
283 return $http({
284 method: 'POST',
285 url: DataService.getHost() +
286 '/xyz/openbmc_project/network/' + interfaceName +
287 '/ipv4/' + networkID + '/action/Delete',
288 headers: {
289 'Accept': 'application/json',
290 'Content-Type': 'application/json'
291 },
292 withCredentials: true,
293 data: JSON.stringify({'data': []})
294 })
295 .then(function(response) {
296 return response.data;
297 });
298 },
299 addIPV4: function(
300 interfaceName, ipAddress, netmaskPrefixLength, gateway) {
301 return $http({
302 method: 'POST',
303 url: DataService.getHost() +
304 '/xyz/openbmc_project/network/' + interfaceName +
305 '/action/IP',
306 headers: {
307 'Accept': 'application/json',
308 'Content-Type': 'application/json'
309 },
310 withCredentials: true,
311 data: JSON.stringify({
312 'data': [
313 'xyz.openbmc_project.Network.IP.Protocol.IPv4',
314 ipAddress, +netmaskPrefixLength, gateway
315 ]
316 })
317 })
318 .then(function(response) {
319 return response.data;
320 });
321 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700322 getLEDState: function() {
323 var deferred = $q.defer();
324 $http({
325 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700326 url: DataService.getHost() +
327 '/xyz/openbmc_project/led/groups/enclosure_identify',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700328 headers: {
329 'Accept': 'application/json',
330 'Content-Type': 'application/json'
331 },
332 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700333 })
334 .then(
335 function(response) {
336 var json = JSON.stringify(response.data);
337 var content = JSON.parse(json);
338 deferred.resolve(content.data.Asserted);
339 },
340 function(error) {
341 console.log(error);
342 deferred.reject(error);
343 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700344 return deferred.promise;
345 },
346 login: function(username, password, callback) {
347 $http({
348 method: 'POST',
349 url: DataService.getHost() + '/login',
350 headers: {
351 'Accept': 'application/json',
352 'Content-Type': 'application/json'
353 },
354 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700355 data: JSON.stringify({'data': [username, password]})
356 })
357 .then(
358 function(response) {
359 if (callback) {
360 callback(response.data);
361 }
362 },
363 function(error) {
364 if (callback) {
365 if (error && error.status && error.status == 'error') {
366 callback(error);
367 } else {
368 callback(error, true);
369 }
370 }
371 console.log(error);
372 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700373 },
374 testPassword: function(username, password) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700375 // Calls /login without the current session to verify the given
376 // password is correct ignore the interceptor logout on a bad password
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700377 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700378 method: 'POST',
379 url: DataService.getHost() + '/login',
380 headers: {
381 'Accept': 'application/json',
382 'Content-Type': 'application/json'
383 },
384 withCredentials: false,
385 data: JSON.stringify({'data': [username, password]})
386 })
387 .then(function(response) {
388 return response.data;
389 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700390 },
391 logout: function(callback) {
392 $http({
393 method: 'POST',
394 url: DataService.getHost() + '/logout',
395 headers: {
396 'Accept': 'application/json',
397 'Content-Type': 'application/json'
398 },
399 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700400 data: JSON.stringify({'data': []})
401 })
402 .then(
403 function(response) {
404 if (callback) {
405 callback(response.data);
406 }
407 },
408 function(error) {
409 if (callback) {
410 callback(null, error);
411 }
412 console.log(error);
413 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700414 },
415 changePassword: function(user, newPassword) {
416 var deferred = $q.defer();
417 $http({
418 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700419 url: DataService.getHost() + '/xyz/openbmc_project/user/' + user +
420 '/action/SetPassword',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700421 headers: {
422 'Accept': 'application/json',
423 'Content-Type': 'application/json'
424 },
425 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700426 data: JSON.stringify({'data': [newPassword]}),
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700427 responseType: 'arraybuffer'
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700428 })
429 .then(
430 function(response, status, headers) {
431 deferred.resolve(
432 {data: response, status: status, headers: headers});
433 },
434 function(error) {
435 console.log(error);
436 deferred.reject(error);
437 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700438 return deferred.promise;
439 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700440 chassisPowerOff: function() {
441 var deferred = $q.defer();
442 $http({
443 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700444 url: DataService.getHost() +
445 '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700446 headers: {
447 'Accept': 'application/json',
448 'Content-Type': 'application/json'
449 },
450 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700451 data: JSON.stringify(
452 {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
453 })
454 .then(
455 function(response) {
456 var json = JSON.stringify(response.data);
457 var content = JSON.parse(json);
458 deferred.resolve(content.status);
459 },
460 function(error) {
461 console.log(error);
462 deferred.reject(error);
463 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700464 return deferred.promise;
465 },
466 setLEDState: function(state, callback) {
467 $http({
468 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700469 url: DataService.getHost() +
470 '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700471 headers: {
472 'Accept': 'application/json',
473 'Content-Type': 'application/json'
474 },
475 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700476 data: JSON.stringify({'data': state})
477 })
478 .then(
479 function(response) {
480 var json = JSON.stringify(response.data);
481 var content = JSON.parse(json);
482 if (callback) {
483 return callback(content.status);
484 }
485 },
486 function(error) {
487 if (callback) {
488 callback(error);
489 } else {
490 console.log(error);
491 }
492 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700493 },
494 bmcReboot: function(callback) {
495 $http({
496 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700497 url: DataService.getHost() +
498 '/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700499 headers: {
500 'Accept': 'application/json',
501 'Content-Type': 'application/json'
502 },
503 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700504 data: JSON.stringify(
505 {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
506 })
507 .then(
508 function(response) {
509 var json = JSON.stringify(response.data);
510 var content = JSON.parse(json);
511 if (callback) {
512 return callback(content.status);
513 }
514 },
515 function(error) {
516 if (callback) {
517 callback(error);
518 } else {
519 console.log(error);
520 }
521 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700522 },
beccabroekbfc99902018-07-24 15:36:33 -0500523 getLastRebootTime: function() {
524 return $http({
525 method: 'GET',
526 url: DataService.getHost() +
527 '/xyz/openbmc_project/state/bmc0/attr/LastRebootTime',
528 headers: {
529 'Accept': 'application/json',
530 'Content-Type': 'application/json'
531 },
532 withCredentials: true
533 })
534 .then(function(response) {
535 return response.data;
536 });
537 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700538 hostPowerOn: function() {
539 var deferred = $q.defer();
540 $http({
541 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700542 url: DataService.getHost() +
543 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700544 headers: {
545 'Accept': 'application/json',
546 'Content-Type': 'application/json'
547 },
548 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700549 data: JSON.stringify(
550 {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
551 })
552 .then(
553 function(response) {
554 var json = JSON.stringify(response.data);
555 var content = JSON.parse(json);
556 deferred.resolve(content.status);
557 },
558 function(error) {
559 console.log(error);
560 deferred.reject(error);
561 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700562 return deferred.promise;
563 },
564 hostPowerOff: function() {
565 var deferred = $q.defer();
566 $http({
567 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700568 url: DataService.getHost() +
569 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700570 headers: {
571 'Accept': 'application/json',
572 'Content-Type': 'application/json'
573 },
574 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700575 data: JSON.stringify(
576 {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
577 })
578 .then(
579 function(response) {
580 var json = JSON.stringify(response.data);
581 var content = JSON.parse(json);
582 deferred.resolve(content.status);
583 },
584 function(error) {
585 console.log(error);
586 deferred.reject(error);
587 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700588 return deferred.promise;
589 },
590 hostReboot: function() {
591 var deferred = $q.defer();
592 $http({
593 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700594 url: DataService.getHost() +
595 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700596 headers: {
597 'Accept': 'application/json',
598 'Content-Type': 'application/json'
599 },
600 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700601 data: JSON.stringify(
602 {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
603 })
604 .then(
605 function(response) {
606 var json = JSON.stringify(response.data);
607 var content = JSON.parse(json);
608 deferred.resolve(content.status);
609 },
610 function(error) {
611 console.log(error);
612 deferred.reject(error);
613 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700614
615 return deferred.promise;
616 },
617 hostShutdown: function(callback) {
618 $http({
619 method: 'POST',
620 url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
621 headers: {
622 'Accept': 'application/json',
623 'Content-Type': 'application/json'
624 },
625 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700626 data: JSON.stringify({'data': []})
627 })
628 .then(
629 function(response) {
630 var json = JSON.stringify(response.data);
631 var content = JSON.parse(json);
632 if (callback) {
633 return callback(content);
634 }
635 },
636 function(error) {
637 if (callback) {
638 callback(error);
639 } else {
640 console.log(error);
641 }
642 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700643 },
beccabroek56744252018-08-03 11:25:11 -0500644 getLastPowerTime: function() {
645 return $http({
646 method: 'GET',
647 url: DataService.getHost() +
648 '/xyz/openbmc_project/state/chassis0/attr/LastStateChangeTime',
649 headers: {
650 'Accept': 'application/json',
651 'Content-Type': 'application/json'
652 },
653 withCredentials: true
654 })
655 .then(function(response) {
656 return response.data;
657 });
658 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700659 getLogs: function() {
660 var deferred = $q.defer();
661 $http({
662 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700663 url: DataService.getHost() +
664 '/xyz/openbmc_project/logging/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700665 headers: {
666 'Accept': 'application/json',
667 'Content-Type': 'application/json'
668 },
669 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700670 })
671 .then(
672 function(response) {
673 var json = JSON.stringify(response.data);
674 var content = JSON.parse(json);
675 var dataClone = JSON.parse(JSON.stringify(content.data));
676 var data = [];
677 var severityCode = '';
678 var priority = '';
679 var health = '';
680 var relatedItems = [];
Matt Spinler845acdc2018-05-01 16:41:28 -0500681 var eventID = 'None';
682 var description = 'None';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700683
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700684 for (var key in content.data) {
685 if (content.data.hasOwnProperty(key) &&
686 content.data[key].hasOwnProperty('Id')) {
687 var severityFlags = {
688 low: false,
689 medium: false,
690 high: false
691 };
692 var healthFlags = {
693 critical: false,
694 warning: false,
695 good: false
696 };
697 severityCode =
698 content.data[key].Severity.split('.').pop();
699 priority =
700 Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
701 severityFlags[priority.toLowerCase()] = true;
702 health = Constants.SEVERITY_TO_HEALTH_MAP[severityCode];
703 healthFlags[health.toLowerCase()] = true;
704 relatedItems = [];
705 content.data[key].associations.forEach(function(item) {
706 relatedItems.push(item[2]);
707 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700708
Matt Spinler845acdc2018-05-01 16:41:28 -0500709 if (content.data[key].hasOwnProperty(['EventID'])) {
710 eventID = content.data[key].EventID;
711 }
712
713 if (content.data[key].hasOwnProperty(['Description'])) {
714 description = content.data[key].Description;
715 }
716
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700717 data.push(Object.assign(
718 {
719 path: key,
720 copied: false,
721 priority: priority,
722 severity_code: severityCode,
723 severity_flags: severityFlags,
724 health_flags: healthFlags,
725 additional_data:
726 content.data[key].AdditionalData.join('\n'),
727 type: content.data[key].Message,
728 selected: false,
729 search_text:
730 ('#' + content.data[key].Id + ' ' +
731 severityCode + ' ' +
Gunnar Mills07876ff2018-06-28 15:21:22 -0500732 content.data[key].Message + ' ' +
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700733 content.data[key].Severity + ' ' +
734 content.data[key].AdditionalData.join(' '))
735 .toLowerCase(),
736 meta: false,
737 confirm: false,
738 related_items: relatedItems,
Matt Spinler845acdc2018-05-01 16:41:28 -0500739 eventID: eventID,
740 description: description,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700741 data: {key: key, value: content.data[key]}
742 },
743 content.data[key]));
744 }
745 }
746 deferred.resolve({data: data, original: dataClone});
747 },
748 function(error) {
749 console.log(error);
750 deferred.reject(error);
751 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700752
753 return deferred.promise;
754 },
755 getAllSensorStatus: function(callback) {
756 $http({
757 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700758 url: DataService.getHost() +
759 '/xyz/openbmc_project/sensors/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700760 headers: {
761 'Accept': 'application/json',
762 'Content-Type': 'application/json'
763 },
764 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700765 })
766 .then(
767 function(response) {
768 var json = JSON.stringify(response.data);
769 var content = JSON.parse(json);
770 var dataClone = JSON.parse(JSON.stringify(content.data));
771 var sensorData = [];
772 var severity = {};
773 var title = '';
774 var tempKeyParts = [];
775 var order = 0;
776 var customOrder = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700777
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700778 function getSensorStatus(reading) {
779 var severityFlags = {
780 critical: false,
781 warning: false,
782 normal: false
783 },
784 severityText = '', order = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700785
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700786 if (reading.hasOwnProperty('CriticalLow') &&
787 reading.Value < reading.CriticalLow) {
788 severityFlags.critical = true;
789 severityText = 'critical';
790 order = 2;
791 } else if (
792 reading.hasOwnProperty('CriticalHigh') &&
793 reading.Value > reading.CriticalHigh) {
794 severityFlags.critical = true;
795 severityText = 'critical';
796 order = 2;
797 } else if (
798 reading.hasOwnProperty('CriticalLow') &&
799 reading.hasOwnProperty('WarningLow') &&
800 reading.Value >= reading.CriticalLow &&
801 reading.Value <= reading.WarningLow) {
802 severityFlags.warning = true;
803 severityText = 'warning';
804 order = 1;
805 } else if (
806 reading.hasOwnProperty('WarningHigh') &&
807 reading.hasOwnProperty('CriticalHigh') &&
808 reading.Value >= reading.WarningHigh &&
809 reading.Value <= reading.CriticalHigh) {
810 severityFlags.warning = true;
811 severityText = 'warning';
812 order = 1;
813 } else {
814 severityFlags.normal = true;
815 severityText = 'normal';
816 }
817 return {
818 flags: severityFlags,
819 severityText: severityText,
820 order: order
821 };
822 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700823
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700824 for (var key in content.data) {
825 if (content.data.hasOwnProperty(key) &&
826 content.data[key].hasOwnProperty('Unit')) {
827 severity = getSensorStatus(content.data[key]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700828
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700829 if (!content.data[key].hasOwnProperty('CriticalLow')) {
830 content.data[key].CriticalLow = '--';
831 content.data[key].CriticalHigh = '--';
832 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700833
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700834 if (!content.data[key].hasOwnProperty('WarningLow')) {
835 content.data[key].WarningLow = '--';
836 content.data[key].WarningHigh = '--';
837 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700838
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700839 tempKeyParts = key.split('/');
840 title = tempKeyParts.pop();
841 title = tempKeyParts.pop() + '_' + title;
842 title = title.split('_')
843 .map(function(item) {
844 return item.toLowerCase()
845 .charAt(0)
846 .toUpperCase() +
847 item.slice(1);
848 })
849 .reduce(function(prev, el) {
850 return prev + ' ' + el;
851 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700852
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700853 content.data[key].Value = getScaledValue(
854 content.data[key].Value, content.data[key].Scale);
855 content.data[key].CriticalLow = getScaledValue(
856 content.data[key].CriticalLow,
857 content.data[key].Scale);
858 content.data[key].CriticalHigh = getScaledValue(
859 content.data[key].CriticalHigh,
860 content.data[key].Scale);
861 content.data[key].WarningLow = getScaledValue(
862 content.data[key].WarningLow,
863 content.data[key].Scale);
864 content.data[key].WarningHigh = getScaledValue(
865 content.data[key].WarningHigh,
866 content.data[key].Scale);
867 if (Constants.SENSOR_SORT_ORDER.indexOf(
868 content.data[key].Unit) > -1) {
869 customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
870 content.data[key].Unit);
871 } else {
872 customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
873 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700874
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700875 sensorData.push(Object.assign(
876 {
877 path: key,
878 selected: false,
879 confirm: false,
880 copied: false,
881 title: title,
882 unit:
883 Constants
884 .SENSOR_UNIT_MAP[content.data[key].Unit],
885 severity_flags: severity.flags,
886 status: severity.severityText,
887 order: severity.order,
888 custom_order: customOrder,
889 search_text:
890 (title + ' ' + content.data[key].Value + ' ' +
891 Constants.SENSOR_UNIT_MAP[content.data[key]
892 .Unit] +
893 ' ' + severity.severityText + ' ' +
894 content.data[key].CriticalLow + ' ' +
895 content.data[key].CriticalHigh + ' ' +
896 content.data[key].WarningLow + ' ' +
897 content.data[key].WarningHigh + ' ')
898 .toLowerCase(),
899 original_data:
900 {key: key, value: content.data[key]}
901 },
902 content.data[key]));
903 }
904 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700905
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700906 callback(sensorData, dataClone);
907 },
908 function(error) {
909 console.log(error);
910 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700911 },
912 getActivation: function(imageId) {
913 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700914 method: 'GET',
915 url: DataService.getHost() +
916 '/xyz/openbmc_project/software/' + imageId +
917 '/attr/Activation',
918 headers: {
919 'Accept': 'application/json',
920 'Content-Type': 'application/json'
921 },
922 withCredentials: true
923 })
924 .then(function(response) {
925 return response.data;
926 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700927 },
928 getFirmwares: function() {
929 var deferred = $q.defer();
930 $http({
931 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700932 url: DataService.getHost() +
933 '/xyz/openbmc_project/software/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700934 headers: {
935 'Accept': 'application/json',
936 'Content-Type': 'application/json'
937 },
938 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700939 })
940 .then(
941 function(response) {
942 var json = JSON.stringify(response.data);
943 var content = JSON.parse(json);
944 var data = [];
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700945 var isExtended = false;
946 var bmcActiveVersion = '';
947 var hostActiveVersion = '';
948 var imageType = '';
949 var extendedVersions = [];
950 var functionalImages = [];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700951
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700952 function getFormatedExtendedVersions(extendedVersion) {
953 var versions = [];
954 extendedVersion = extendedVersion.split(',');
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700955
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700956 extendedVersion.forEach(function(item) {
957 var parts = item.split('-');
958 var numberIndex = 0;
959 for (var i = 0; i < parts.length; i++) {
960 if (/[0-9]/.test(parts[i])) {
961 numberIndex = i;
962 break;
963 }
964 }
965 var titlePart = parts.splice(0, numberIndex);
966 titlePart = titlePart.join('');
967 titlePart = titlePart[0].toUpperCase() +
968 titlePart.substr(1, titlePart.length);
969 var versionPart = parts.join('-');
970 versions.push({title: titlePart, version: versionPart});
971 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700972
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700973 return versions;
974 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700975
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700976 // Get the list of functional images so we can compare
977 // later if an image is functional
978 if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
979 functionalImages =
980 content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
981 .endpoints;
982 }
983 for (var key in content.data) {
984 if (content.data.hasOwnProperty(key) &&
985 content.data[key].hasOwnProperty('Version')) {
Gunnar Millsac9131e2018-07-13 15:52:18 -0500986 var activationStatus = '';
987
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700988 // If the image is "Functional" use that for the
989 // activation status, else use the value of "Activation"
990 // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
Gunnar Millsac9131e2018-07-13 15:52:18 -0500991 if (content.data[key].Activation) {
992 activationStatus =
993 content.data[key].Activation.split('.').pop();
994 }
995
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700996 if (functionalImages.includes(key)) {
997 activationStatus = 'Functional';
998 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700999
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001000 imageType = content.data[key].Purpose.split('.').pop();
1001 isExtended = content.data[key].hasOwnProperty(
1002 'ExtendedVersion') &&
1003 content.data[key].ExtendedVersion != '';
1004 if (isExtended) {
1005 extendedVersions = getFormatedExtendedVersions(
1006 content.data[key].ExtendedVersion);
1007 }
1008 data.push(Object.assign(
1009 {
1010 path: key,
1011 activationStatus: activationStatus,
1012 imageId: key.split('/').pop(),
1013 imageType: imageType,
1014 isExtended: isExtended,
1015 extended:
1016 {show: false, versions: extendedVersions},
1017 data: {key: key, value: content.data[key]}
1018 },
1019 content.data[key]));
1020
1021 if (activationStatus == 'Functional' &&
1022 imageType == 'BMC') {
1023 bmcActiveVersion = content.data[key].Version;
1024 }
1025
1026 if (activationStatus == 'Functional' &&
1027 imageType == 'Host') {
1028 hostActiveVersion = content.data[key].Version;
1029 }
1030 }
1031 }
1032
1033 deferred.resolve({
1034 data: data,
1035 bmcActiveVersion: bmcActiveVersion,
1036 hostActiveVersion: hostActiveVersion
1037 });
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001038 },
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001039 function(error) {
1040 console.log(error);
1041 deferred.reject(error);
1042 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001043
1044 return deferred.promise;
1045 },
1046 changePriority: function(imageId, priority) {
1047 var deferred = $q.defer();
1048 $http({
1049 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001050 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1051 imageId + '/attr/Priority',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001052 headers: {
1053 'Accept': 'application/json',
1054 'Content-Type': 'application/json'
1055 },
1056 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001057 data: JSON.stringify({'data': priority})
1058 })
1059 .then(
1060 function(response) {
1061 var json = JSON.stringify(response.data);
1062 var content = JSON.parse(json);
1063 deferred.resolve(content);
1064 },
1065 function(error) {
1066 console.log(error);
1067 deferred.reject(error);
1068 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001069
1070 return deferred.promise;
1071 },
1072 deleteImage: function(imageId) {
1073 var deferred = $q.defer();
1074 $http({
1075 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001076 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1077 imageId + '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001078 headers: {
1079 'Accept': 'application/json',
1080 'Content-Type': 'application/json'
1081 },
1082 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001083 data: JSON.stringify({'data': []})
1084 })
1085 .then(
1086 function(response) {
1087 var json = JSON.stringify(response.data);
1088 var content = JSON.parse(json);
1089 deferred.resolve(content);
1090 },
1091 function(error) {
1092 console.log(error);
1093 deferred.reject(error);
1094 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001095
1096 return deferred.promise;
1097 },
1098 activateImage: function(imageId) {
1099 var deferred = $q.defer();
1100 $http({
1101 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001102 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1103 imageId + '/attr/RequestedActivation',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001104 headers: {
1105 'Accept': 'application/json',
1106 'Content-Type': 'application/json'
1107 },
1108 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001109 data:
1110 JSON.stringify({'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1111 })
1112 .then(
1113 function(response) {
1114 var json = JSON.stringify(response.data);
1115 var content = JSON.parse(json);
1116 deferred.resolve(content);
1117 },
1118 function(error) {
1119 console.log(error);
1120 deferred.reject(error);
1121 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001122
1123 return deferred.promise;
1124 },
1125 uploadImage: function(file) {
1126 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001127 method: 'POST',
1128 timeout: 5 * 60 * 1000,
1129 url: DataService.getHost() + '/upload/image',
1130 headers: {'Content-Type': 'application/octet-stream'},
1131 withCredentials: true,
1132 data: file
1133 })
1134 .then(function(response) {
1135 return response.data;
1136 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001137 },
1138 downloadImage: function(host, filename) {
1139 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001140 method: 'POST',
1141 url: DataService.getHost() +
1142 '/xyz/openbmc_project/software/action/DownloadViaTFTP',
1143 headers: {
1144 'Accept': 'application/json',
1145 'Content-Type': 'application/json'
1146 },
1147 withCredentials: true,
1148 data: JSON.stringify({'data': [filename, host]}),
1149 responseType: 'arraybuffer'
1150 })
1151 .then(function(response) {
1152 return response.data;
1153 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001154 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001155 getServerInfo: function() {
1156 // TODO: openbmc/openbmc#3117 Need a way via REST to get
1157 // interfaces so we can get the system object(s) by the looking
1158 // for the system interface.
1159 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001160 method: 'GET',
1161 url: DataService.getHost() +
1162 '/xyz/openbmc_project/inventory/system',
1163 headers: {
1164 'Accept': 'application/json',
1165 'Content-Type': 'application/json'
1166 },
1167 withCredentials: true
1168 })
1169 .then(function(response) {
1170 return response.data;
1171 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001172 },
1173 getBMCTime: function() {
1174 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001175 method: 'GET',
1176 url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
1177 headers: {
1178 'Accept': 'application/json',
1179 'Content-Type': 'application/json'
1180 },
1181 withCredentials: true
1182 })
1183 .then(function(response) {
1184 return response.data;
1185 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001186 },
Gunnar Millsc74d4342018-07-18 14:52:02 -05001187 getTime: function() {
1188 return $http({
1189 method: 'GET',
1190 url: DataService.getHost() +
1191 '/xyz/openbmc_project/time/enumerate',
1192 headers: {
1193 'Accept': 'application/json',
1194 'Content-Type': 'application/json'
1195 },
1196 withCredentials: true
1197 })
1198 .then(function(response) {
1199 return response.data;
1200 });
1201 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001202 getHardwares: function(callback) {
1203 $http({
1204 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001205 url: DataService.getHost() +
1206 '/xyz/openbmc_project/inventory/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001207 headers: {
1208 'Accept': 'application/json',
1209 'Content-Type': 'application/json'
1210 },
1211 withCredentials: true
1212 }).then(function(response) {
1213 var json = JSON.stringify(response.data);
1214 var content = JSON.parse(json);
1215 var hardwareData = [];
1216 var keyIndexMap = {};
1217 var title = '';
1218 var data = [];
1219 var searchText = '';
1220 var componentIndex = -1;
1221 var tempParts = [];
1222
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001223 function isSubComponent(key) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001224 for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1225 i++) {
1226 if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1227 2)
1228 return true;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001229 }
1230
1231 return false;
1232 }
1233
1234 function titlelize(title) {
1235 title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001236 for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1237 i++) {
1238 if (title.toLowerCase().indexOf(
1239 (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001240 return title.toUpperCase();
1241 }
1242 }
1243
1244 return title;
1245 }
1246
1247 function camelcaseToLabel(obj) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001248 var transformed = [], label = '', value = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001249 for (var key in obj) {
1250 label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1251 if (obj[key] !== '') {
1252 value = obj[key];
1253 if (value == 1 || value == 0) {
1254 value = (value == 1) ? 'Yes' : 'No';
1255 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001256 transformed.push({key: label, value: value});
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001257 }
1258 }
1259
1260 return transformed;
1261 }
1262
1263 function getSearchText(data) {
1264 var searchText = '';
1265 for (var i = 0; i < data.length; i++) {
1266 searchText += ' ' + data[i].key + ' ' + data[i].value;
1267 }
1268
1269 return searchText;
1270 }
1271
1272 for (var key in content.data) {
1273 if (content.data.hasOwnProperty(key) &&
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001274 key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001275 data = camelcaseToLabel(content.data[key]);
1276 searchText = getSearchText(data);
1277 title = key.split('/').pop();
1278
1279 title = titlelize(title);
1280
1281 if (!isSubComponent(key)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001282 hardwareData.push(Object.assign(
1283 {
1284 path: key,
1285 title: title,
1286 selected: false,
1287 expanded: false,
1288 search_text: title.toLowerCase() + ' ' +
1289 searchText.toLowerCase(),
1290 sub_components: [],
1291 original_data: {key: key, value: content.data[key]}
1292 },
1293 {items: data}));
Iftekharul Islam2a489552017-11-02 13:23:08 -05001294
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001295 keyIndexMap[key] = hardwareData.length - 1;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001296 } else {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001297 var tempParts = key.split('/');
1298 tempParts.pop();
1299 tempParts = tempParts.join('/');
1300 componentIndex = keyIndexMap[tempParts];
1301 data = content.data[key];
1302 data.title = title;
1303 hardwareData[componentIndex].sub_components.push(data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001304 hardwareData[componentIndex].search_text +=
1305 ' ' + title.toLowerCase();
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001306
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001307 // Sort the subcomponents alphanumeric so they are displayed
1308 // on the inventory page in order (e.g. core 0, core 1, core
1309 // 2, ... core 12, core 13)
1310 hardwareData[componentIndex].sub_components.sort(function(
1311 a, b) {
1312 return a.title.localeCompare(
1313 b.title, 'en', {numeric: true});
Gunnar Mills55a8e392018-03-14 15:37:44 -05001314 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001315 }
1316 }
1317 }
1318
1319 if (callback) {
1320 callback(hardwareData, content.data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001321 } else {
1322 return {data: hardwareData, original_data: content.data};
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001323 }
1324 });
1325 },
1326 deleteLogs: function(logs) {
1327 var defer = $q.defer();
1328 var promises = [];
1329
1330 function finished() {
1331 defer.resolve();
1332 }
1333
1334 logs.forEach(function(item) {
1335 promises.push($http({
1336 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001337 url: DataService.getHost() +
1338 '/xyz/openbmc_project/logging/entry/' + item.Id +
1339 '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001340 headers: {
1341 'Accept': 'application/json',
1342 'Content-Type': 'application/json'
Gunnar Mills55a8e392018-03-14 15:37:44 -05001343 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001344 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001345 data: JSON.stringify({'data': []})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001346 }));
1347 });
1348
1349 $q.all(promises).then(finished);
1350
1351 return defer.promise;
1352 },
1353 resolveLogs: function(logs) {
1354 var defer = $q.defer();
1355 var promises = [];
1356
1357 function finished() {
1358 defer.resolve();
1359 }
1360
1361 logs.forEach(function(item) {
1362 promises.push($http({
1363 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001364 url: DataService.getHost() +
1365 '/xyz/openbmc_project/logging/entry/' + item.Id +
1366 '/attr/Resolved',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001367 headers: {
1368 'Accept': 'application/json',
1369 'Content-Type': 'application/json'
Iftekharul Islam99d199f2017-03-24 15:28:25 -05001370 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001371 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001372 data: JSON.stringify({'data': '1'})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001373 }));
1374 });
Iftekharul Islama1d238f2018-02-26 12:29:45 -06001375
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001376 $q.all(promises).then(finished);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001377
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001378 return defer.promise;
1379 },
1380 getPowerConsumption: function() {
1381 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001382 method: 'GET',
1383 url: DataService.getHost() +
1384 '/xyz/openbmc_project/sensors/power/total_power',
1385 headers: {
1386 'Accept': 'application/json',
1387 'Content-Type': 'application/json'
1388 },
1389 withCredentials: true
1390 })
1391 .then(
1392 function(response) {
1393 var json = JSON.stringify(response.data);
1394 var content = JSON.parse(json);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001395
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001396 return getScaledValue(
1397 content.data.Value, content.data.Scale) +
1398 ' ' +
1399 Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1400 },
1401 function(error) {
1402 if ('Not Found' == error.statusText) {
1403 return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1404 } else {
1405 throw error;
1406 }
1407 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001408 },
1409 getPowerCap: function() {
1410 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001411 method: 'GET',
1412 url: DataService.getHost() +
1413 '/xyz/openbmc_project/control/host0/power_cap',
1414 headers: {
1415 'Accept': 'application/json',
1416 'Content-Type': 'application/json'
1417 },
1418 withCredentials: true
1419 })
1420 .then(function(response) {
Gunnar Mills006aaa02018-06-26 16:08:59 -05001421 return response.data;
1422 });
1423 },
1424 setPowerCapEnable: function(powerCapEnable) {
1425 return $http({
1426 method: 'PUT',
1427 url: DataService.getHost() +
1428 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCapEnable',
1429 headers: {
1430 'Accept': 'application/json',
1431 'Content-Type': 'application/json'
1432 },
1433 withCredentials: true,
1434 data: JSON.stringify({'data': powerCapEnable})
1435 })
1436 .then(function(response) {
1437 return response.data;
1438 });
1439 },
1440 setPowerCap: function(powerCap) {
1441 return $http({
1442 method: 'PUT',
1443 url: DataService.getHost() +
1444 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCap',
1445 headers: {
1446 'Accept': 'application/json',
1447 'Content-Type': 'application/json'
1448 },
1449 withCredentials: true,
1450 data: JSON.stringify({'data': powerCap})
1451 })
1452 .then(function(response) {
1453 return response.data;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001454 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001455 },
1456 setHostname: function(hostname) {
1457 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001458 method: 'PUT',
1459 url: DataService.getHost() +
1460 '/xyz/openbmc_project/network/config/attr/HostName',
1461 headers: {
1462 'Accept': 'application/json',
1463 'Content-Type': 'application/json'
1464 },
1465 withCredentials: true,
1466 data: JSON.stringify({'data': hostname})
1467 })
1468 .then(function(response) {
1469 return response.data;
1470 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001471 },
1472 };
1473 return SERVICE;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001474 }
1475 ]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001476})(window.angular);