blob: 9f1cc23a6a76d579a3dd4faf45943024924c909a [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 },
59 getHostState: function() {
60 var deferred = $q.defer();
61 $http({
62 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070063 url: DataService.getHost() +
64 '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070065 headers: {
66 'Accept': 'application/json',
67 'Content-Type': 'application/json'
68 },
69 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070070 })
71 .then(
72 function(response) {
73 var json = JSON.stringify(response.data);
74 var content = JSON.parse(json);
75 deferred.resolve(content.data);
76 },
77 function(error) {
78 console.log(error);
79 deferred.reject(error);
80 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070081 return deferred.promise;
82 },
83 getNetworkInfo: function() {
84 var deferred = $q.defer();
85 $http({
86 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070087 url: DataService.getHost() +
88 '/xyz/openbmc_project/network/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070089 headers: {
90 'Accept': 'application/json',
91 'Content-Type': 'application/json'
92 },
93 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070094 })
95 .then(
96 function(response) {
97 var json = JSON.stringify(response.data);
98 var content = JSON.parse(json);
99 var hostname = '';
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500100 var defaultgateway = '';
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700101 var macAddress = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700102
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700103 function parseNetworkData(content) {
104 var data = {
105 interface_ids: [],
106 interfaces: {},
107 ip_addresses: {ipv4: [], ipv6: []},
108 };
109 var interfaceId = '', keyParts = [], interfaceHash = '',
110 interfaceType = '';
111 for (var key in content.data) {
112 if (key.match(/network\/eth\d+$/ig)) {
113 interfaceId = key.split('/').pop();
114 if (data.interface_ids.indexOf(interfaceId) == -1) {
115 data.interface_ids.push(interfaceId);
116 data.interfaces[interfaceId] = {
117 interfaceIname: '',
118 DomainName: '',
119 MACAddress: '',
120 Nameservers: [],
121 DHCPEnabled: 0,
122 ipv4: {ids: [], values: []},
123 ipv6: {ids: [], values: []}
124 };
125 data.interfaces[interfaceId].MACAddress =
126 content.data[key].MACAddress;
127 data.interfaces[interfaceId].DomainName =
128 content.data[key].DomainName.join(' ');
129 data.interfaces[interfaceId].Nameservers =
130 content.data[key].Nameservers;
131 data.interfaces[interfaceId].DHCPEnabled =
132 content.data[key].DHCPEnabled;
133 }
134 } else if (
135 key.match(
136 /network\/eth\d+\/ipv[4|6]\/[a-z0-9]+$/ig)) {
137 keyParts = key.split('/');
138 interfaceHash = keyParts.pop();
139 interfaceType = keyParts.pop();
140 interfaceId = keyParts.pop();
141
142 if (data.interfaces[interfaceId][interfaceType]
143 .ids.indexOf(interfaceHash) == -1) {
144 data.interfaces[interfaceId][interfaceType]
145 .ids.push(interfaceHash);
146 data.interfaces[interfaceId][interfaceType]
147 .values.push(content.data[key]);
148 data.ip_addresses[interfaceType].push(
149 content.data[key]['Address']);
150 }
151 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700152 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700153 return data;
154 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700155
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700156 if (content.data.hasOwnProperty(
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500157 '/xyz/openbmc_project/network/config')) {
158 if (content.data['/xyz/openbmc_project/network/config']
159 .hasOwnProperty('HostName')) {
160 hostname =
161 content.data['/xyz/openbmc_project/network/config']
162 .HostName;
163 }
164 if (content.data['/xyz/openbmc_project/network/config']
165 .hasOwnProperty('DefaultGateway')) {
166 defaultgateway =
167 content.data['/xyz/openbmc_project/network/config']
168 .DefaultGateway;
169 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700170 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700171
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700172 if (content.data.hasOwnProperty(
173 '/xyz/openbmc_project/network/eth0') &&
174 content.data['/xyz/openbmc_project/network/eth0']
175 .hasOwnProperty('MACAddress')) {
176 macAddress =
177 content.data['/xyz/openbmc_project/network/eth0']
178 .MACAddress;
179 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700180
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700181 deferred.resolve({
182 data: content.data,
183 hostname: hostname,
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500184 defaultgateway: defaultgateway,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700185 mac_address: macAddress,
186 formatted_data: parseNetworkData(content)
187 });
188 },
189 function(error) {
190 console.log(error);
191 deferred.reject(error);
192 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700193 return deferred.promise;
194 },
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500195 setMACAddress: function(interface_name, mac_address) {
196 return $http({
197 method: 'PUT',
198 url: DataService.getHost() +
199 '/xyz/openbmc_project/network/' + interface_name +
200 '/attr/MACAddress',
201 headers: {
202 'Accept': 'application/json',
203 'Content-Type': 'application/json'
204 },
205 withCredentials: true,
206 data: JSON.stringify({'data': mac_address})
207 })
208 .then(function(response) {
209 return response.data;
210 });
211 },
Gunnar Millsdca79d72018-05-30 13:07:01 -0500212 setDefaultGateway: function(defaultGateway) {
213 return $http({
214 method: 'PUT',
215 url: DataService.getHost() +
216 '/xyz/openbmc_project/network/config/attr/DefaultGateway',
217 headers: {
218 'Accept': 'application/json',
219 'Content-Type': 'application/json'
220 },
221 withCredentials: true,
222 data: JSON.stringify({'data': defaultGateway})
223 })
224 .then(function(response) {
225 return response.data;
226 });
227 },
Gunnar Millsa45c3852018-05-30 16:18:45 -0500228 deleteIPV4: function(interfaceName, networkID) {
229 return $http({
230 method: 'POST',
231 url: DataService.getHost() +
232 '/xyz/openbmc_project/network/' + interfaceName +
233 '/ipv4/' + networkID + '/action/Delete',
234 headers: {
235 'Accept': 'application/json',
236 'Content-Type': 'application/json'
237 },
238 withCredentials: true,
239 data: JSON.stringify({'data': []})
240 })
241 .then(function(response) {
242 return response.data;
243 });
244 },
245 addIPV4: function(
246 interfaceName, ipAddress, netmaskPrefixLength, gateway) {
247 return $http({
248 method: 'POST',
249 url: DataService.getHost() +
250 '/xyz/openbmc_project/network/' + interfaceName +
251 '/action/IP',
252 headers: {
253 'Accept': 'application/json',
254 'Content-Type': 'application/json'
255 },
256 withCredentials: true,
257 data: JSON.stringify({
258 'data': [
259 'xyz.openbmc_project.Network.IP.Protocol.IPv4',
260 ipAddress, +netmaskPrefixLength, gateway
261 ]
262 })
263 })
264 .then(function(response) {
265 return response.data;
266 });
267 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700268 getLEDState: function() {
269 var deferred = $q.defer();
270 $http({
271 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700272 url: DataService.getHost() +
273 '/xyz/openbmc_project/led/groups/enclosure_identify',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700274 headers: {
275 'Accept': 'application/json',
276 'Content-Type': 'application/json'
277 },
278 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700279 })
280 .then(
281 function(response) {
282 var json = JSON.stringify(response.data);
283 var content = JSON.parse(json);
284 deferred.resolve(content.data.Asserted);
285 },
286 function(error) {
287 console.log(error);
288 deferred.reject(error);
289 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700290 return deferred.promise;
291 },
292 login: function(username, password, callback) {
293 $http({
294 method: 'POST',
295 url: DataService.getHost() + '/login',
296 headers: {
297 'Accept': 'application/json',
298 'Content-Type': 'application/json'
299 },
300 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700301 data: JSON.stringify({'data': [username, password]})
302 })
303 .then(
304 function(response) {
305 if (callback) {
306 callback(response.data);
307 }
308 },
309 function(error) {
310 if (callback) {
311 if (error && error.status && error.status == 'error') {
312 callback(error);
313 } else {
314 callback(error, true);
315 }
316 }
317 console.log(error);
318 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700319 },
320 testPassword: function(username, password) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700321 // Calls /login without the current session to verify the given
322 // password is correct ignore the interceptor logout on a bad password
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700323 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700324 method: 'POST',
325 url: DataService.getHost() + '/login',
326 headers: {
327 'Accept': 'application/json',
328 'Content-Type': 'application/json'
329 },
330 withCredentials: false,
331 data: JSON.stringify({'data': [username, password]})
332 })
333 .then(function(response) {
334 return response.data;
335 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700336 },
337 logout: function(callback) {
338 $http({
339 method: 'POST',
340 url: DataService.getHost() + '/logout',
341 headers: {
342 'Accept': 'application/json',
343 'Content-Type': 'application/json'
344 },
345 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700346 data: JSON.stringify({'data': []})
347 })
348 .then(
349 function(response) {
350 if (callback) {
351 callback(response.data);
352 }
353 },
354 function(error) {
355 if (callback) {
356 callback(null, error);
357 }
358 console.log(error);
359 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700360 },
361 changePassword: function(user, newPassword) {
362 var deferred = $q.defer();
363 $http({
364 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700365 url: DataService.getHost() + '/xyz/openbmc_project/user/' + user +
366 '/action/SetPassword',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700367 headers: {
368 'Accept': 'application/json',
369 'Content-Type': 'application/json'
370 },
371 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700372 data: JSON.stringify({'data': [newPassword]}),
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700373 responseType: 'arraybuffer'
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700374 })
375 .then(
376 function(response, status, headers) {
377 deferred.resolve(
378 {data: response, status: status, headers: headers});
379 },
380 function(error) {
381 console.log(error);
382 deferred.reject(error);
383 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700384 return deferred.promise;
385 },
386 chassisPowerOn: function(callback) {
387 $http({
388 method: 'POST',
389 url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
390 headers: {
391 'Accept': 'application/json',
392 'Content-Type': 'application/json'
393 },
394 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700395 data: JSON.stringify({'data': []})
396 })
397 .then(
398 function(response) {
399 var json = JSON.stringify(response.data);
400 var content = JSON.parse(json);
401 if (callback) {
402 return callback(content.data.CurrentPowerState);
403 }
404 },
405 function(error) {
406 if (callback) {
407 callback(error);
408 } else {
409 console.log(error);
410 }
411 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700412 },
413 chassisPowerOff: function() {
414 var deferred = $q.defer();
415 $http({
416 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700417 url: DataService.getHost() +
418 '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700419 headers: {
420 'Accept': 'application/json',
421 'Content-Type': 'application/json'
422 },
423 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700424 data: JSON.stringify(
425 {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
426 })
427 .then(
428 function(response) {
429 var json = JSON.stringify(response.data);
430 var content = JSON.parse(json);
431 deferred.resolve(content.status);
432 },
433 function(error) {
434 console.log(error);
435 deferred.reject(error);
436 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700437 return deferred.promise;
438 },
439 setLEDState: function(state, callback) {
440 $http({
441 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700442 url: DataService.getHost() +
443 '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700444 headers: {
445 'Accept': 'application/json',
446 'Content-Type': 'application/json'
447 },
448 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700449 data: JSON.stringify({'data': state})
450 })
451 .then(
452 function(response) {
453 var json = JSON.stringify(response.data);
454 var content = JSON.parse(json);
455 if (callback) {
456 return callback(content.status);
457 }
458 },
459 function(error) {
460 if (callback) {
461 callback(error);
462 } else {
463 console.log(error);
464 }
465 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700466 },
467 bmcReboot: function(callback) {
468 $http({
469 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700470 url: DataService.getHost() +
471 '/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700472 headers: {
473 'Accept': 'application/json',
474 'Content-Type': 'application/json'
475 },
476 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700477 data: JSON.stringify(
478 {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
479 })
480 .then(
481 function(response) {
482 var json = JSON.stringify(response.data);
483 var content = JSON.parse(json);
484 if (callback) {
485 return callback(content.status);
486 }
487 },
488 function(error) {
489 if (callback) {
490 callback(error);
491 } else {
492 console.log(error);
493 }
494 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700495 },
496 hostPowerOn: function() {
497 var deferred = $q.defer();
498 $http({
499 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700500 url: DataService.getHost() +
501 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700502 headers: {
503 'Accept': 'application/json',
504 'Content-Type': 'application/json'
505 },
506 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700507 data: JSON.stringify(
508 {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
509 })
510 .then(
511 function(response) {
512 var json = JSON.stringify(response.data);
513 var content = JSON.parse(json);
514 deferred.resolve(content.status);
515 },
516 function(error) {
517 console.log(error);
518 deferred.reject(error);
519 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700520 return deferred.promise;
521 },
522 hostPowerOff: function() {
523 var deferred = $q.defer();
524 $http({
525 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700526 url: DataService.getHost() +
527 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700528 headers: {
529 'Accept': 'application/json',
530 'Content-Type': 'application/json'
531 },
532 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700533 data: JSON.stringify(
534 {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
535 })
536 .then(
537 function(response) {
538 var json = JSON.stringify(response.data);
539 var content = JSON.parse(json);
540 deferred.resolve(content.status);
541 },
542 function(error) {
543 console.log(error);
544 deferred.reject(error);
545 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700546 return deferred.promise;
547 },
548 hostReboot: function() {
549 var deferred = $q.defer();
550 $http({
551 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700552 url: DataService.getHost() +
553 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700554 headers: {
555 'Accept': 'application/json',
556 'Content-Type': 'application/json'
557 },
558 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700559 data: JSON.stringify(
560 {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
561 })
562 .then(
563 function(response) {
564 var json = JSON.stringify(response.data);
565 var content = JSON.parse(json);
566 deferred.resolve(content.status);
567 },
568 function(error) {
569 console.log(error);
570 deferred.reject(error);
571 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700572
573 return deferred.promise;
574 },
575 hostShutdown: function(callback) {
576 $http({
577 method: 'POST',
578 url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
579 headers: {
580 'Accept': 'application/json',
581 'Content-Type': 'application/json'
582 },
583 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700584 data: JSON.stringify({'data': []})
585 })
586 .then(
587 function(response) {
588 var json = JSON.stringify(response.data);
589 var content = JSON.parse(json);
590 if (callback) {
591 return callback(content);
592 }
593 },
594 function(error) {
595 if (callback) {
596 callback(error);
597 } else {
598 console.log(error);
599 }
600 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700601 },
602 getLogs: function() {
603 var deferred = $q.defer();
604 $http({
605 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700606 url: DataService.getHost() +
607 '/xyz/openbmc_project/logging/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700608 headers: {
609 'Accept': 'application/json',
610 'Content-Type': 'application/json'
611 },
612 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700613 })
614 .then(
615 function(response) {
616 var json = JSON.stringify(response.data);
617 var content = JSON.parse(json);
618 var dataClone = JSON.parse(JSON.stringify(content.data));
619 var data = [];
620 var severityCode = '';
621 var priority = '';
622 var health = '';
623 var relatedItems = [];
Matt Spinler845acdc2018-05-01 16:41:28 -0500624 var eventID = 'None';
625 var description = 'None';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700626
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700627 for (var key in content.data) {
628 if (content.data.hasOwnProperty(key) &&
629 content.data[key].hasOwnProperty('Id')) {
630 var severityFlags = {
631 low: false,
632 medium: false,
633 high: false
634 };
635 var healthFlags = {
636 critical: false,
637 warning: false,
638 good: false
639 };
640 severityCode =
641 content.data[key].Severity.split('.').pop();
642 priority =
643 Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
644 severityFlags[priority.toLowerCase()] = true;
645 health = Constants.SEVERITY_TO_HEALTH_MAP[severityCode];
646 healthFlags[health.toLowerCase()] = true;
647 relatedItems = [];
648 content.data[key].associations.forEach(function(item) {
649 relatedItems.push(item[2]);
650 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700651
Matt Spinler845acdc2018-05-01 16:41:28 -0500652 if (content.data[key].hasOwnProperty(['EventID'])) {
653 eventID = content.data[key].EventID;
654 }
655
656 if (content.data[key].hasOwnProperty(['Description'])) {
657 description = content.data[key].Description;
658 }
659
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700660 data.push(Object.assign(
661 {
662 path: key,
663 copied: false,
664 priority: priority,
665 severity_code: severityCode,
666 severity_flags: severityFlags,
667 health_flags: healthFlags,
668 additional_data:
669 content.data[key].AdditionalData.join('\n'),
670 type: content.data[key].Message,
671 selected: false,
672 search_text:
673 ('#' + content.data[key].Id + ' ' +
674 severityCode + ' ' +
675 content.data[key].Severity + ' ' +
676 content.data[key].AdditionalData.join(' '))
677 .toLowerCase(),
678 meta: false,
679 confirm: false,
680 related_items: relatedItems,
Matt Spinler845acdc2018-05-01 16:41:28 -0500681 eventID: eventID,
682 description: description,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700683 data: {key: key, value: content.data[key]}
684 },
685 content.data[key]));
686 }
687 }
688 deferred.resolve({data: data, original: dataClone});
689 },
690 function(error) {
691 console.log(error);
692 deferred.reject(error);
693 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700694
695 return deferred.promise;
696 },
697 getAllSensorStatus: function(callback) {
698 $http({
699 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700700 url: DataService.getHost() +
701 '/xyz/openbmc_project/sensors/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700702 headers: {
703 'Accept': 'application/json',
704 'Content-Type': 'application/json'
705 },
706 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700707 })
708 .then(
709 function(response) {
710 var json = JSON.stringify(response.data);
711 var content = JSON.parse(json);
712 var dataClone = JSON.parse(JSON.stringify(content.data));
713 var sensorData = [];
714 var severity = {};
715 var title = '';
716 var tempKeyParts = [];
717 var order = 0;
718 var customOrder = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700719
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700720 function getSensorStatus(reading) {
721 var severityFlags = {
722 critical: false,
723 warning: false,
724 normal: false
725 },
726 severityText = '', order = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700727
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700728 if (reading.hasOwnProperty('CriticalLow') &&
729 reading.Value < reading.CriticalLow) {
730 severityFlags.critical = true;
731 severityText = 'critical';
732 order = 2;
733 } else if (
734 reading.hasOwnProperty('CriticalHigh') &&
735 reading.Value > reading.CriticalHigh) {
736 severityFlags.critical = true;
737 severityText = 'critical';
738 order = 2;
739 } else if (
740 reading.hasOwnProperty('CriticalLow') &&
741 reading.hasOwnProperty('WarningLow') &&
742 reading.Value >= reading.CriticalLow &&
743 reading.Value <= reading.WarningLow) {
744 severityFlags.warning = true;
745 severityText = 'warning';
746 order = 1;
747 } else if (
748 reading.hasOwnProperty('WarningHigh') &&
749 reading.hasOwnProperty('CriticalHigh') &&
750 reading.Value >= reading.WarningHigh &&
751 reading.Value <= reading.CriticalHigh) {
752 severityFlags.warning = true;
753 severityText = 'warning';
754 order = 1;
755 } else {
756 severityFlags.normal = true;
757 severityText = 'normal';
758 }
759 return {
760 flags: severityFlags,
761 severityText: severityText,
762 order: order
763 };
764 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700765
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700766 for (var key in content.data) {
767 if (content.data.hasOwnProperty(key) &&
768 content.data[key].hasOwnProperty('Unit')) {
769 severity = getSensorStatus(content.data[key]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700770
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700771 if (!content.data[key].hasOwnProperty('CriticalLow')) {
772 content.data[key].CriticalLow = '--';
773 content.data[key].CriticalHigh = '--';
774 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700775
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700776 if (!content.data[key].hasOwnProperty('WarningLow')) {
777 content.data[key].WarningLow = '--';
778 content.data[key].WarningHigh = '--';
779 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700780
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700781 tempKeyParts = key.split('/');
782 title = tempKeyParts.pop();
783 title = tempKeyParts.pop() + '_' + title;
784 title = title.split('_')
785 .map(function(item) {
786 return item.toLowerCase()
787 .charAt(0)
788 .toUpperCase() +
789 item.slice(1);
790 })
791 .reduce(function(prev, el) {
792 return prev + ' ' + el;
793 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700794
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700795 content.data[key].Value = getScaledValue(
796 content.data[key].Value, content.data[key].Scale);
797 content.data[key].CriticalLow = getScaledValue(
798 content.data[key].CriticalLow,
799 content.data[key].Scale);
800 content.data[key].CriticalHigh = getScaledValue(
801 content.data[key].CriticalHigh,
802 content.data[key].Scale);
803 content.data[key].WarningLow = getScaledValue(
804 content.data[key].WarningLow,
805 content.data[key].Scale);
806 content.data[key].WarningHigh = getScaledValue(
807 content.data[key].WarningHigh,
808 content.data[key].Scale);
809 if (Constants.SENSOR_SORT_ORDER.indexOf(
810 content.data[key].Unit) > -1) {
811 customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
812 content.data[key].Unit);
813 } else {
814 customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
815 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700816
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700817 sensorData.push(Object.assign(
818 {
819 path: key,
820 selected: false,
821 confirm: false,
822 copied: false,
823 title: title,
824 unit:
825 Constants
826 .SENSOR_UNIT_MAP[content.data[key].Unit],
827 severity_flags: severity.flags,
828 status: severity.severityText,
829 order: severity.order,
830 custom_order: customOrder,
831 search_text:
832 (title + ' ' + content.data[key].Value + ' ' +
833 Constants.SENSOR_UNIT_MAP[content.data[key]
834 .Unit] +
835 ' ' + severity.severityText + ' ' +
836 content.data[key].CriticalLow + ' ' +
837 content.data[key].CriticalHigh + ' ' +
838 content.data[key].WarningLow + ' ' +
839 content.data[key].WarningHigh + ' ')
840 .toLowerCase(),
841 original_data:
842 {key: key, value: content.data[key]}
843 },
844 content.data[key]));
845 }
846 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700847
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700848 callback(sensorData, dataClone);
849 },
850 function(error) {
851 console.log(error);
852 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700853 },
854 getActivation: function(imageId) {
855 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700856 method: 'GET',
857 url: DataService.getHost() +
858 '/xyz/openbmc_project/software/' + imageId +
859 '/attr/Activation',
860 headers: {
861 'Accept': 'application/json',
862 'Content-Type': 'application/json'
863 },
864 withCredentials: true
865 })
866 .then(function(response) {
867 return response.data;
868 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700869 },
870 getFirmwares: function() {
871 var deferred = $q.defer();
872 $http({
873 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700874 url: DataService.getHost() +
875 '/xyz/openbmc_project/software/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700876 headers: {
877 'Accept': 'application/json',
878 'Content-Type': 'application/json'
879 },
880 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700881 })
882 .then(
883 function(response) {
884 var json = JSON.stringify(response.data);
885 var content = JSON.parse(json);
886 var data = [];
887 var activationStatus = '';
888 var isExtended = false;
889 var bmcActiveVersion = '';
890 var hostActiveVersion = '';
891 var imageType = '';
892 var extendedVersions = [];
893 var functionalImages = [];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700894
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700895 function getFormatedExtendedVersions(extendedVersion) {
896 var versions = [];
897 extendedVersion = extendedVersion.split(',');
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700898
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700899 extendedVersion.forEach(function(item) {
900 var parts = item.split('-');
901 var numberIndex = 0;
902 for (var i = 0; i < parts.length; i++) {
903 if (/[0-9]/.test(parts[i])) {
904 numberIndex = i;
905 break;
906 }
907 }
908 var titlePart = parts.splice(0, numberIndex);
909 titlePart = titlePart.join('');
910 titlePart = titlePart[0].toUpperCase() +
911 titlePart.substr(1, titlePart.length);
912 var versionPart = parts.join('-');
913 versions.push({title: titlePart, version: versionPart});
914 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700915
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700916 return versions;
917 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700918
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700919 // Get the list of functional images so we can compare
920 // later if an image is functional
921 if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
922 functionalImages =
923 content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
924 .endpoints;
925 }
926 for (var key in content.data) {
927 if (content.data.hasOwnProperty(key) &&
928 content.data[key].hasOwnProperty('Version')) {
929 // If the image is "Functional" use that for the
930 // activation status, else use the value of "Activation"
931 // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
932 activationStatus =
933 content.data[key].Activation.split('.').pop();
934 if (functionalImages.includes(key)) {
935 activationStatus = 'Functional';
936 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700937
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700938 imageType = content.data[key].Purpose.split('.').pop();
939 isExtended = content.data[key].hasOwnProperty(
940 'ExtendedVersion') &&
941 content.data[key].ExtendedVersion != '';
942 if (isExtended) {
943 extendedVersions = getFormatedExtendedVersions(
944 content.data[key].ExtendedVersion);
945 }
946 data.push(Object.assign(
947 {
948 path: key,
949 activationStatus: activationStatus,
950 imageId: key.split('/').pop(),
951 imageType: imageType,
952 isExtended: isExtended,
953 extended:
954 {show: false, versions: extendedVersions},
955 data: {key: key, value: content.data[key]}
956 },
957 content.data[key]));
958
959 if (activationStatus == 'Functional' &&
960 imageType == 'BMC') {
961 bmcActiveVersion = content.data[key].Version;
962 }
963
964 if (activationStatus == 'Functional' &&
965 imageType == 'Host') {
966 hostActiveVersion = content.data[key].Version;
967 }
968 }
969 }
970
971 deferred.resolve({
972 data: data,
973 bmcActiveVersion: bmcActiveVersion,
974 hostActiveVersion: hostActiveVersion
975 });
Iftekharul Islam171c6a12017-08-11 08:35:47 -0500976 },
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700977 function(error) {
978 console.log(error);
979 deferred.reject(error);
980 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700981
982 return deferred.promise;
983 },
984 changePriority: function(imageId, priority) {
985 var deferred = $q.defer();
986 $http({
987 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700988 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
989 imageId + '/attr/Priority',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700990 headers: {
991 'Accept': 'application/json',
992 'Content-Type': 'application/json'
993 },
994 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700995 data: JSON.stringify({'data': priority})
996 })
997 .then(
998 function(response) {
999 var json = JSON.stringify(response.data);
1000 var content = JSON.parse(json);
1001 deferred.resolve(content);
1002 },
1003 function(error) {
1004 console.log(error);
1005 deferred.reject(error);
1006 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001007
1008 return deferred.promise;
1009 },
1010 deleteImage: function(imageId) {
1011 var deferred = $q.defer();
1012 $http({
1013 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001014 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1015 imageId + '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001016 headers: {
1017 'Accept': 'application/json',
1018 'Content-Type': 'application/json'
1019 },
1020 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001021 data: JSON.stringify({'data': []})
1022 })
1023 .then(
1024 function(response) {
1025 var json = JSON.stringify(response.data);
1026 var content = JSON.parse(json);
1027 deferred.resolve(content);
1028 },
1029 function(error) {
1030 console.log(error);
1031 deferred.reject(error);
1032 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001033
1034 return deferred.promise;
1035 },
1036 activateImage: function(imageId) {
1037 var deferred = $q.defer();
1038 $http({
1039 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001040 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1041 imageId + '/attr/RequestedActivation',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001042 headers: {
1043 'Accept': 'application/json',
1044 'Content-Type': 'application/json'
1045 },
1046 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001047 data:
1048 JSON.stringify({'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1049 })
1050 .then(
1051 function(response) {
1052 var json = JSON.stringify(response.data);
1053 var content = JSON.parse(json);
1054 deferred.resolve(content);
1055 },
1056 function(error) {
1057 console.log(error);
1058 deferred.reject(error);
1059 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001060
1061 return deferred.promise;
1062 },
1063 uploadImage: function(file) {
1064 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001065 method: 'POST',
1066 timeout: 5 * 60 * 1000,
1067 url: DataService.getHost() + '/upload/image',
1068 headers: {'Content-Type': 'application/octet-stream'},
1069 withCredentials: true,
1070 data: file
1071 })
1072 .then(function(response) {
1073 return response.data;
1074 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001075 },
1076 downloadImage: function(host, filename) {
1077 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001078 method: 'POST',
1079 url: DataService.getHost() +
1080 '/xyz/openbmc_project/software/action/DownloadViaTFTP',
1081 headers: {
1082 'Accept': 'application/json',
1083 'Content-Type': 'application/json'
1084 },
1085 withCredentials: true,
1086 data: JSON.stringify({'data': [filename, host]}),
1087 responseType: 'arraybuffer'
1088 })
1089 .then(function(response) {
1090 return response.data;
1091 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001092 },
1093 getBMCEthernetInfo: function() {
1094 var deferred = $q.defer();
1095 $http({
1096 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001097 url: DataService.getHost() +
1098 '/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc/ethernet',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001099 headers: {
1100 'Accept': 'application/json',
1101 'Content-Type': 'application/json'
1102 },
1103 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001104 })
1105 .then(
1106 function(response) {
1107 var json = JSON.stringify(response.data);
1108 var content = JSON.parse(json);
1109 deferred.resolve(content.data);
1110 },
1111 function(error) {
1112 console.log(error);
1113 deferred.reject(error);
1114 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001115
1116 return deferred.promise;
1117 },
1118 getBMCInfo: function(callback) {
1119 var deferred = $q.defer();
1120 $http({
1121 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001122 url: DataService.getHost() +
1123 '/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001124 headers: {
1125 'Accept': 'application/json',
1126 'Content-Type': 'application/json'
1127 },
1128 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001129 })
1130 .then(
1131 function(response) {
1132 var json = JSON.stringify(response.data);
1133 var content = JSON.parse(json);
1134 deferred.resolve(content.data);
1135 },
1136 function(error) {
1137 console.log(error);
1138 deferred.reject(error);
1139 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001140 return deferred.promise;
1141 },
1142 getServerInfo: function() {
1143 // TODO: openbmc/openbmc#3117 Need a way via REST to get
1144 // interfaces so we can get the system object(s) by the looking
1145 // for the system interface.
1146 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001147 method: 'GET',
1148 url: DataService.getHost() +
1149 '/xyz/openbmc_project/inventory/system',
1150 headers: {
1151 'Accept': 'application/json',
1152 'Content-Type': 'application/json'
1153 },
1154 withCredentials: true
1155 })
1156 .then(function(response) {
1157 return response.data;
1158 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001159 },
1160 getBMCTime: function() {
1161 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001162 method: 'GET',
1163 url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
1164 headers: {
1165 'Accept': 'application/json',
1166 'Content-Type': 'application/json'
1167 },
1168 withCredentials: true
1169 })
1170 .then(function(response) {
1171 return response.data;
1172 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001173 },
1174 getHardwares: function(callback) {
1175 $http({
1176 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001177 url: DataService.getHost() +
1178 '/xyz/openbmc_project/inventory/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001179 headers: {
1180 'Accept': 'application/json',
1181 'Content-Type': 'application/json'
1182 },
1183 withCredentials: true
1184 }).then(function(response) {
1185 var json = JSON.stringify(response.data);
1186 var content = JSON.parse(json);
1187 var hardwareData = [];
1188 var keyIndexMap = {};
1189 var title = '';
1190 var data = [];
1191 var searchText = '';
1192 var componentIndex = -1;
1193 var tempParts = [];
1194
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001195 function isSubComponent(key) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001196 for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1197 i++) {
1198 if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1199 2)
1200 return true;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001201 }
1202
1203 return false;
1204 }
1205
1206 function titlelize(title) {
1207 title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001208 for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1209 i++) {
1210 if (title.toLowerCase().indexOf(
1211 (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001212 return title.toUpperCase();
1213 }
1214 }
1215
1216 return title;
1217 }
1218
1219 function camelcaseToLabel(obj) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001220 var transformed = [], label = '', value = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001221 for (var key in obj) {
1222 label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1223 if (obj[key] !== '') {
1224 value = obj[key];
1225 if (value == 1 || value == 0) {
1226 value = (value == 1) ? 'Yes' : 'No';
1227 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001228 transformed.push({key: label, value: value});
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001229 }
1230 }
1231
1232 return transformed;
1233 }
1234
1235 function getSearchText(data) {
1236 var searchText = '';
1237 for (var i = 0; i < data.length; i++) {
1238 searchText += ' ' + data[i].key + ' ' + data[i].value;
1239 }
1240
1241 return searchText;
1242 }
1243
1244 for (var key in content.data) {
1245 if (content.data.hasOwnProperty(key) &&
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001246 key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001247 data = camelcaseToLabel(content.data[key]);
1248 searchText = getSearchText(data);
1249 title = key.split('/').pop();
1250
1251 title = titlelize(title);
1252
1253 if (!isSubComponent(key)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001254 hardwareData.push(Object.assign(
1255 {
1256 path: key,
1257 title: title,
1258 selected: false,
1259 expanded: false,
1260 search_text: title.toLowerCase() + ' ' +
1261 searchText.toLowerCase(),
1262 sub_components: [],
1263 original_data: {key: key, value: content.data[key]}
1264 },
1265 {items: data}));
Iftekharul Islam2a489552017-11-02 13:23:08 -05001266
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001267 keyIndexMap[key] = hardwareData.length - 1;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001268 } else {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001269 var tempParts = key.split('/');
1270 tempParts.pop();
1271 tempParts = tempParts.join('/');
1272 componentIndex = keyIndexMap[tempParts];
1273 data = content.data[key];
1274 data.title = title;
1275 hardwareData[componentIndex].sub_components.push(data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001276 hardwareData[componentIndex].search_text +=
1277 ' ' + title.toLowerCase();
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001278
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001279 // Sort the subcomponents alphanumeric so they are displayed
1280 // on the inventory page in order (e.g. core 0, core 1, core
1281 // 2, ... core 12, core 13)
1282 hardwareData[componentIndex].sub_components.sort(function(
1283 a, b) {
1284 return a.title.localeCompare(
1285 b.title, 'en', {numeric: true});
Gunnar Mills55a8e392018-03-14 15:37:44 -05001286 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001287 }
1288 }
1289 }
1290
1291 if (callback) {
1292 callback(hardwareData, content.data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001293 } else {
1294 return {data: hardwareData, original_data: content.data};
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001295 }
1296 });
1297 },
1298 deleteLogs: function(logs) {
1299 var defer = $q.defer();
1300 var promises = [];
1301
1302 function finished() {
1303 defer.resolve();
1304 }
1305
1306 logs.forEach(function(item) {
1307 promises.push($http({
1308 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001309 url: DataService.getHost() +
1310 '/xyz/openbmc_project/logging/entry/' + item.Id +
1311 '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001312 headers: {
1313 'Accept': 'application/json',
1314 'Content-Type': 'application/json'
Gunnar Mills55a8e392018-03-14 15:37:44 -05001315 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001316 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001317 data: JSON.stringify({'data': []})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001318 }));
1319 });
1320
1321 $q.all(promises).then(finished);
1322
1323 return defer.promise;
1324 },
1325 resolveLogs: function(logs) {
1326 var defer = $q.defer();
1327 var promises = [];
1328
1329 function finished() {
1330 defer.resolve();
1331 }
1332
1333 logs.forEach(function(item) {
1334 promises.push($http({
1335 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001336 url: DataService.getHost() +
1337 '/xyz/openbmc_project/logging/entry/' + item.Id +
1338 '/attr/Resolved',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001339 headers: {
1340 'Accept': 'application/json',
1341 'Content-Type': 'application/json'
Iftekharul Islam99d199f2017-03-24 15:28:25 -05001342 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001343 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001344 data: JSON.stringify({'data': '1'})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001345 }));
1346 });
Iftekharul Islama1d238f2018-02-26 12:29:45 -06001347
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001348 $q.all(promises).then(finished);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001349
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001350 return defer.promise;
1351 },
1352 getPowerConsumption: function() {
1353 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001354 method: 'GET',
1355 url: DataService.getHost() +
1356 '/xyz/openbmc_project/sensors/power/total_power',
1357 headers: {
1358 'Accept': 'application/json',
1359 'Content-Type': 'application/json'
1360 },
1361 withCredentials: true
1362 })
1363 .then(
1364 function(response) {
1365 var json = JSON.stringify(response.data);
1366 var content = JSON.parse(json);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001367
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001368 return getScaledValue(
1369 content.data.Value, content.data.Scale) +
1370 ' ' +
1371 Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1372 },
1373 function(error) {
1374 if ('Not Found' == error.statusText) {
1375 return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1376 } else {
1377 throw error;
1378 }
1379 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001380 },
1381 getPowerCap: function() {
1382 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001383 method: 'GET',
1384 url: DataService.getHost() +
1385 '/xyz/openbmc_project/control/host0/power_cap',
1386 headers: {
1387 'Accept': 'application/json',
1388 'Content-Type': 'application/json'
1389 },
1390 withCredentials: true
1391 })
1392 .then(function(response) {
1393 var json = JSON.stringify(response.data);
1394 var content = JSON.parse(json);
Michael Davisdf3bd122017-08-10 11:03:42 -05001395
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001396 return (false == content.data.PowerCapEnable) ?
1397 Constants.POWER_CAP_TEXT.disabled :
1398 content.data.PowerCap + ' ' + Constants.POWER_CAP_TEXT.unit;
1399 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001400 },
1401 setHostname: function(hostname) {
1402 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001403 method: 'PUT',
1404 url: DataService.getHost() +
1405 '/xyz/openbmc_project/network/config/attr/HostName',
1406 headers: {
1407 'Accept': 'application/json',
1408 'Content-Type': 'application/json'
1409 },
1410 withCredentials: true,
1411 data: JSON.stringify({'data': hostname})
1412 })
1413 .then(function(response) {
1414 return response.data;
1415 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001416 },
1417 };
1418 return SERVICE;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001419 }
1420 ]);
Iftekharul Islamd2269e22017-05-02 09:32:45 -05001421
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001422})(window.angular);