blob: 211f6d7c63da90d822e7652efc09ef537094a702 [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', [
beccabroekc3abaa92018-08-14 13:47:18 -050012 '$http', 'Constants', '$q', 'dataService', '$interval',
13 function($http, Constants, $q, DataService, $interval) {
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 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070042 })
43 .then(
44 function(response) {
45 var json = JSON.stringify(response.data);
46 var content = JSON.parse(json);
47 deferred.resolve(content.data);
48 },
49 function(error) {
50 console.log(error);
51 deferred.reject(error);
52 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070053 return deferred.promise;
54 },
Gunnar Mills65491142018-06-04 14:23:33 -050055 validIPV4IP: function(ip) {
56 // Checks for [0-255].[0-255].[0-255].[0-255]
57 return ip.match(
58 /\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/);
59 },
AppaRao Pulib1289ec2018-11-14 20:33:30 +053060 getRedfishSysName: function() {
61 return $http({
62 method: 'GET',
63 url: DataService.getHost() + '/redfish/v1/Systems',
64 withCredentials: true
65 })
66 .then(
67 function(response) {
68 var sysUrl = response.data['Members'][0]['@odata.id'];
69 return sysUrl.split('/').pop(-1);
70 },
71 function(error) {
72 console.log(JSON.stringify(error));
73 });
74 },
75 getSystemLogs: function(recordType) {
76 var uri = '/redfish/v1/Systems/' + DataService.systemName +
77 '/LogServices/EventLog/Entries';
78 return $http({
79 method: 'GET',
80 url: DataService.getHost() + uri,
81 withCredentials: true
82 })
83 .then(
84 function(response) {
85 var logEntries = [];
86 angular.forEach(response.data['Members'], function(log) {
87 if (log.hasOwnProperty('EntryType')) {
88 if (log['EntryType'] == recordType) {
89 logEntries.push(log);
90 }
91 }
92 });
93 return logEntries;
94 },
95 function(error) {
96 console.log(JSON.stringify(error));
97 });
98 },
99 clearSystemLogs: function() {
100 var uri = '/redfish/v1/Systems/' + DataService.systemName +
101 '/LogServices/EventLog/Actions/LogService.ClearLog';
102 return $http({
103 method: 'POST',
104 url: DataService.getHost() + uri,
105 withCredentials: true
106 });
107 },
Gunnar Mills854fbba2018-09-13 15:41:30 -0500108 deleteObject: function(path) {
109 return $http({
110 method: 'POST',
111 url: DataService.getHost() + path + '/action/Delete',
112 withCredentials: true,
113 data: JSON.stringify({'data': []})
114 })
115 .then(function(response) {
116 return response.data;
117 });
118 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700119 getHostState: function() {
120 var deferred = $q.defer();
121 $http({
122 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700123 url: DataService.getHost() +
124 '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700125 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700126 })
127 .then(
128 function(response) {
129 var json = JSON.stringify(response.data);
130 var content = JSON.parse(json);
131 deferred.resolve(content.data);
132 },
133 function(error) {
134 console.log(error);
135 deferred.reject(error);
136 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700137 return deferred.promise;
138 },
Gunnar Millsff64c542018-08-24 15:49:09 -0500139 getSNMPManagers: function() {
140 return $http({
141 method: 'GET',
142 url: DataService.getHost() +
143 '/xyz/openbmc_project/network/snmp/manager/enumerate',
Gunnar Millsff64c542018-08-24 15:49:09 -0500144 withCredentials: true
145 })
146 .then(function(response) {
147 return response.data;
148 });
149 },
beccabroekc3abaa92018-08-14 13:47:18 -0500150 pollHostStatusTillOn: function() {
151 var deferred = $q.defer();
152 var hostOnTimeout = setTimeout(function() {
153 ws.close();
154 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
155 }, Constants.TIMEOUT.HOST_ON);
156
157 var ws =
158 new WebSocket('wss://' + DataService.server_id + '/subscribe');
159 var data = JSON.stringify({
160 'paths': ['/xyz/openbmc_project/state/host0'],
161 'interfaces': ['xyz.openbmc_project.State.Host']
162 });
163 ws.onopen = function() {
164 ws.send(data);
165 };
166 ws.onmessage = function(evt) {
167 var content = JSON.parse(evt.data);
168 var hostState = content.properties.CurrentHostState;
169 if (hostState === Constants.HOST_STATE_TEXT.on_code) {
170 clearTimeout(hostOnTimeout);
171 ws.close();
172 deferred.resolve();
173 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
174 clearTimeout(hostOnTimeout);
175 ws.close();
176 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
177 }
178 };
179 },
180
181 pollHostStatusTilReboot: function() {
182 var deferred = $q.defer();
183 var onState = Constants.HOST_STATE_TEXT.on_code;
184 var offState = Constants.HOST_STATE_TEXT.on_code;
185 var hostTimeout;
186 var setHostTimeout = function(message, timeout) {
187 hostTimeout = setTimeout(function() {
188 ws.close();
189 deferred.reject(new Error(message));
190 }, timeout);
191 };
192 var ws =
193 new WebSocket('wss://' + DataService.server_id + '/subscribe');
194 var data = JSON.stringify({
195 'paths': ['/xyz/openbmc_project/state/host0'],
196 'interfaces': ['xyz.openbmc_project.State.Host']
197 });
198 ws.onopen = function() {
199 ws.send(data);
200 };
201 setHostTimeout(
202 Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT,
203 Constants.TIMEOUT.HOST_OFF);
204 var pollState = offState;
205 ws.onmessage = function(evt) {
206 var content = JSON.parse(evt.data);
207 var hostState = content.properties.CurrentHostState;
208 if (hostState === pollState) {
209 if (pollState === offState) {
210 clearTimeout(hostTimeout);
211 pollState = onState;
212 setHostTimeout(
213 Constants.MESSAGES.POLL.HOST_ON_TIMEOUT,
214 Constants.TIMEOUT.HOST_ON);
215 }
216 if (pollState === onState) {
217 clearTimeout(hostTimeout);
218 ws.close();
219 deferred.resolve();
220 }
221 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
222 clearTimeout(hostTimeout);
223 ws.close();
224 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
225 }
226 };
227 },
228
229 pollHostStatusTillOff: function() {
230 var deferred = $q.defer();
231 var hostOffTimeout = setTimeout(function() {
232 ws.close();
233 deferred.reject(
234 new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
235 }, Constants.TIMEOUT.HOST_OFF);
236
237 var ws =
238 new WebSocket('wss://' + DataService.server_id + '/subscribe');
239 var data = JSON.stringify({
240 'paths': ['/xyz/openbmc_project/state/host0'],
241 'interfaces': ['xyz.openbmc_project.State.Host']
242 });
243 ws.onopen = function() {
244 ws.send(data);
245 };
246 ws.onmessage = function(evt) {
247 var content = JSON.parse(evt.data);
248 var hostState = content.properties.CurrentHostState;
249 if (hostState === Constants.HOST_STATE_TEXT.off_code) {
250 clearTimeout(hostOffTimeout);
251 ws.close();
252 deferred.resolve();
253 }
254 };
255 },
Gunnar Mills854fbba2018-09-13 15:41:30 -0500256 addSNMPManager: function(address, port) {
257 return $http({
258 method: 'POST',
259 url: DataService.getHost() +
260 '/xyz/openbmc_project/network/snmp/manager/action/Client',
261 withCredentials: true,
262 data: JSON.stringify({'data': [address, +port]})
263 })
264 .then(function(response) {
265 return response.data;
266 });
267 },
268 setSNMPManagerPort: function(snmpManagerPath, port) {
269 return $http({
270 method: 'PUT',
271 url: DataService.getHost() + snmpManagerPath + '/attr/Port',
272 withCredentials: true,
273 data: JSON.stringify({'data': +port})
274 })
275 .then(function(response) {
276 return response.data;
277 });
278 },
279 setSNMPManagerAddress: function(snmpManagerPath, address) {
280 return $http({
281 method: 'PUT',
282 url: DataService.getHost() + snmpManagerPath +
283 '/attr/Address',
284 withCredentials: true,
285 data: JSON.stringify({'data': address})
286 })
287 .then(function(response) {
288 return response.data;
289 });
290 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700291 getNetworkInfo: function() {
292 var deferred = $q.defer();
293 $http({
294 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700295 url: DataService.getHost() +
296 '/xyz/openbmc_project/network/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700297 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700298 })
299 .then(
300 function(response) {
301 var json = JSON.stringify(response.data);
302 var content = JSON.parse(json);
303 var hostname = '';
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500304 var defaultgateway = '';
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700305 var macAddress = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700306
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700307 function parseNetworkData(content) {
308 var data = {
309 interface_ids: [],
310 interfaces: {},
311 ip_addresses: {ipv4: [], ipv6: []},
312 };
313 var interfaceId = '', keyParts = [], interfaceHash = '',
314 interfaceType = '';
315 for (var key in content.data) {
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500316 if (key.match(/network\/eth\d+(_\d+)?$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700317 interfaceId = key.split('/').pop();
318 if (data.interface_ids.indexOf(interfaceId) == -1) {
319 data.interface_ids.push(interfaceId);
320 data.interfaces[interfaceId] = {
321 interfaceIname: '',
322 DomainName: '',
323 MACAddress: '',
324 Nameservers: [],
325 DHCPEnabled: 0,
326 ipv4: {ids: [], values: []},
327 ipv6: {ids: [], values: []}
328 };
329 data.interfaces[interfaceId].MACAddress =
330 content.data[key].MACAddress;
331 data.interfaces[interfaceId].DomainName =
332 content.data[key].DomainName.join(' ');
333 data.interfaces[interfaceId].Nameservers =
334 content.data[key].Nameservers;
335 data.interfaces[interfaceId].DHCPEnabled =
336 content.data[key].DHCPEnabled;
337 }
338 } else if (
339 key.match(
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500340 /network\/eth\d+(_\d+)?\/ipv[4|6]\/[a-z0-9]+$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700341 keyParts = key.split('/');
342 interfaceHash = keyParts.pop();
343 interfaceType = keyParts.pop();
344 interfaceId = keyParts.pop();
345
346 if (data.interfaces[interfaceId][interfaceType]
347 .ids.indexOf(interfaceHash) == -1) {
348 data.interfaces[interfaceId][interfaceType]
349 .ids.push(interfaceHash);
350 data.interfaces[interfaceId][interfaceType]
351 .values.push(content.data[key]);
352 data.ip_addresses[interfaceType].push(
353 content.data[key]['Address']);
354 }
355 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700356 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700357 return data;
358 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700359
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700360 if (content.data.hasOwnProperty(
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500361 '/xyz/openbmc_project/network/config')) {
362 if (content.data['/xyz/openbmc_project/network/config']
363 .hasOwnProperty('HostName')) {
364 hostname =
365 content.data['/xyz/openbmc_project/network/config']
366 .HostName;
367 }
368 if (content.data['/xyz/openbmc_project/network/config']
369 .hasOwnProperty('DefaultGateway')) {
370 defaultgateway =
371 content.data['/xyz/openbmc_project/network/config']
372 .DefaultGateway;
373 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700374 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700375
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700376 if (content.data.hasOwnProperty(
377 '/xyz/openbmc_project/network/eth0') &&
378 content.data['/xyz/openbmc_project/network/eth0']
379 .hasOwnProperty('MACAddress')) {
380 macAddress =
381 content.data['/xyz/openbmc_project/network/eth0']
382 .MACAddress;
383 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700384
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700385 deferred.resolve({
386 data: content.data,
387 hostname: hostname,
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500388 defaultgateway: defaultgateway,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700389 mac_address: macAddress,
390 formatted_data: parseNetworkData(content)
391 });
392 },
393 function(error) {
394 console.log(error);
395 deferred.reject(error);
396 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700397 return deferred.promise;
398 },
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500399 setMACAddress: function(interface_name, mac_address) {
400 return $http({
401 method: 'PUT',
402 url: DataService.getHost() +
403 '/xyz/openbmc_project/network/' + interface_name +
404 '/attr/MACAddress',
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500405 withCredentials: true,
406 data: JSON.stringify({'data': mac_address})
407 })
408 .then(function(response) {
409 return response.data;
410 });
411 },
Gunnar Millsdca79d72018-05-30 13:07:01 -0500412 setDefaultGateway: function(defaultGateway) {
413 return $http({
414 method: 'PUT',
415 url: DataService.getHost() +
416 '/xyz/openbmc_project/network/config/attr/DefaultGateway',
Gunnar Millsdca79d72018-05-30 13:07:01 -0500417 withCredentials: true,
418 data: JSON.stringify({'data': defaultGateway})
419 })
420 .then(function(response) {
421 return response.data;
422 });
423 },
Gunnar Millscb2c3062018-05-31 13:13:30 -0500424 setDHCPEnabled: function(interfaceName, dhcpEnabled) {
425 return $http({
426 method: 'PUT',
427 url: DataService.getHost() +
428 '/xyz/openbmc_project/network/' + interfaceName +
429 '/attr/DHCPEnabled',
Gunnar Millscb2c3062018-05-31 13:13:30 -0500430 withCredentials: true,
431 data: JSON.stringify({'data': dhcpEnabled})
432 })
433 .then(function(response) {
434 return response.data;
435 });
436 },
Gunnar Mills06467822018-06-06 15:43:18 -0500437 setNameservers: function(interfaceName, dnsServers) {
438 return $http({
439 method: 'PUT',
440 url: DataService.getHost() +
441 '/xyz/openbmc_project/network/' + interfaceName +
442 '/attr/Nameservers',
Gunnar Mills06467822018-06-06 15:43:18 -0500443 withCredentials: true,
444 data: JSON.stringify({'data': dnsServers})
445 })
446 .then(function(response) {
447 return response.data;
448 });
449 },
Gunnar Millsa45c3852018-05-30 16:18:45 -0500450 deleteIPV4: function(interfaceName, networkID) {
451 return $http({
452 method: 'POST',
453 url: DataService.getHost() +
454 '/xyz/openbmc_project/network/' + interfaceName +
455 '/ipv4/' + networkID + '/action/Delete',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500456 withCredentials: true,
457 data: JSON.stringify({'data': []})
458 })
459 .then(function(response) {
460 return response.data;
461 });
462 },
463 addIPV4: function(
464 interfaceName, ipAddress, netmaskPrefixLength, gateway) {
465 return $http({
466 method: 'POST',
467 url: DataService.getHost() +
468 '/xyz/openbmc_project/network/' + interfaceName +
469 '/action/IP',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500470 withCredentials: true,
471 data: JSON.stringify({
472 'data': [
473 'xyz.openbmc_project.Network.IP.Protocol.IPv4',
474 ipAddress, +netmaskPrefixLength, gateway
475 ]
476 })
477 })
478 .then(function(response) {
479 return response.data;
480 });
481 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700482 getLEDState: function() {
483 var deferred = $q.defer();
484 $http({
485 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700486 url: DataService.getHost() +
487 '/xyz/openbmc_project/led/groups/enclosure_identify',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700488 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700489 })
490 .then(
491 function(response) {
492 var json = JSON.stringify(response.data);
493 var content = JSON.parse(json);
494 deferred.resolve(content.data.Asserted);
495 },
496 function(error) {
497 console.log(error);
498 deferred.reject(error);
499 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700500 return deferred.promise;
501 },
502 login: function(username, password, callback) {
503 $http({
504 method: 'POST',
505 url: DataService.getHost() + '/login',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700506 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700507 data: JSON.stringify({'data': [username, password]})
508 })
509 .then(
510 function(response) {
511 if (callback) {
512 callback(response.data);
513 }
514 },
515 function(error) {
516 if (callback) {
517 if (error && error.status && error.status == 'error') {
518 callback(error);
519 } else {
520 callback(error, true);
521 }
522 }
523 console.log(error);
524 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700525 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700526 logout: function(callback) {
527 $http({
528 method: 'POST',
529 url: DataService.getHost() + '/logout',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700530 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700531 data: JSON.stringify({'data': []})
532 })
533 .then(
534 function(response) {
535 if (callback) {
536 callback(response.data);
537 }
538 },
539 function(error) {
540 if (callback) {
541 callback(null, error);
542 }
543 console.log(error);
544 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700545 },
AppaRao Pulicf7219c2018-12-27 16:17:46 +0530546 getAccountServiceRoles: function() {
547 var roles = [];
548
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500549 return $http({
550 method: 'GET',
551 url: DataService.getHost() +
552 '/redfish/v1/AccountService/Roles',
553 withCredentials: true
554 })
555 .then(
556 function(response) {
557 var members = response.data['Members'];
558 angular.forEach(members, function(member) {
559 roles.push(member['@odata.id'].split('/').pop());
AppaRao Pulicf7219c2018-12-27 16:17:46 +0530560 });
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500561 return roles;
562 },
563 function(error) {
564 console.log(error);
565 });
AppaRao Pulicf7219c2018-12-27 16:17:46 +0530566 },
567 getAllUserAccounts: function() {
AppaRao Puli28711a62018-10-17 16:07:55 +0530568 var deferred = $q.defer();
569 var promises = [];
570 var users = [];
571
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500572 $http({
573 method: 'GET',
574 url: DataService.getHost() + '/redfish/v1/AccountService/Accounts',
575 withCredentials: true
576 })
577 .then(
578 function(response) {
579 var members = response.data['Members'];
580 angular.forEach(members, function(member) {
581 promises.push(
582 $http({
583 method: 'GET',
584 url: DataService.getHost() + member['@odata.id'],
585 withCredentials: true
586 }).then(function(res) {
587 return res.data;
AppaRao Puli28711a62018-10-17 16:07:55 +0530588 }));
AppaRao Puli28711a62018-10-17 16:07:55 +0530589 });
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500590
591 $q.all(promises).then(
592 function(results) {
593 deferred.resolve(results);
594 },
595 function(errors) {
596 deferred.reject(errors);
597 });
598 },
599 function(error) {
600 console.log(error);
601 deferred.reject(error);
602 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530603 return deferred.promise;
604 },
AppaRao Pulib1e7c862019-03-12 14:56:40 +0530605
606 getAllUserAccountProperties: function(callback) {
607 return $http({
608 method: 'GET',
609 url: DataService.getHost() + '/redfish/v1/AccountService',
610 withCredentials: true
611 })
612 .then(
613 function(response) {
614 return response.data;
615 },
616 function(error) {
617 console.log(error);
618 });
619 },
620
621 saveUserAccountProperties: function(lockoutduration, lockoutthreshold) {
622 var data = {};
623 if (lockoutduration != undefined) {
624 data['AccountLockoutDuration'] = lockoutduration;
625 }
626 if (lockoutthreshold != undefined) {
627 data['AccountLockoutThreshold'] = lockoutthreshold;
628 }
629
630 return $http({
631 method: 'PATCH',
632 url: DataService.getHost() + '/redfish/v1/AccountService',
633 withCredentials: true,
634 data: data
635 });
636 },
637
AppaRao Puli28711a62018-10-17 16:07:55 +0530638 createUser: function(user, passwd, role, enabled) {
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500639 var data = {};
640 data['UserName'] = user;
641 data['Password'] = passwd;
642 data['RoleId'] = role;
643 data['Enabled'] = enabled;
AppaRao Puli28711a62018-10-17 16:07:55 +0530644
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500645 return $http({
646 method: 'POST',
647 url: DataService.getHost() + '/redfish/v1/AccountService/Accounts',
648 withCredentials: true,
649 data: data
650 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530651 },
652 updateUser: function(user, newUser, passwd, role, enabled) {
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500653 var data = {};
654 if ((newUser !== undefined) && (newUser != null)) {
655 data['UserName'] = newUser;
AppaRao Puli28711a62018-10-17 16:07:55 +0530656 }
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500657 if ((role !== undefined) && (role != null)) {
658 data['RoleId'] = role;
659 }
660 if ((enabled !== undefined) && (enabled != null)) {
661 data['Enabled'] = enabled;
662 }
663 if ((passwd !== undefined) && (passwd != null)) {
664 data['Password'] = passwd;
665 }
666 return $http({
667 method: 'PATCH',
668 url: DataService.getHost() +
669 '/redfish/v1/AccountService/Accounts/' + user,
670 withCredentials: true,
671 data: data
672 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530673 },
674 deleteUser: function(user) {
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500675 return $http({
676 method: 'DELETE',
677 url: DataService.getHost() +
678 '/redfish/v1/AccountService/Accounts/' + user,
679 withCredentials: true,
680 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530681 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700682 chassisPowerOff: function() {
683 var deferred = $q.defer();
684 $http({
685 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700686 url: DataService.getHost() +
687 '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700688 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700689 data: JSON.stringify(
690 {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
691 })
692 .then(
693 function(response) {
694 var json = JSON.stringify(response.data);
695 var content = JSON.parse(json);
696 deferred.resolve(content.status);
697 },
698 function(error) {
699 console.log(error);
700 deferred.reject(error);
701 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700702 return deferred.promise;
703 },
beccabroekb7f0ee12019-01-10 11:15:58 -0600704 setLEDState: function(state) {
705 return $http({
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700706 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700707 url: DataService.getHost() +
708 '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700709 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700710 data: JSON.stringify({'data': state})
711 })
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700712 },
713 bmcReboot: function(callback) {
714 $http({
715 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700716 url: DataService.getHost() +
Gunnar Mills70086982019-01-04 15:10:04 -0600717 '/xyz/openbmc_project/state/bmc0/attr/RequestedBMCTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700718 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700719 data: JSON.stringify(
720 {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
721 })
722 .then(
723 function(response) {
724 var json = JSON.stringify(response.data);
725 var content = JSON.parse(json);
726 if (callback) {
727 return callback(content.status);
728 }
729 },
730 function(error) {
731 if (callback) {
732 callback(error);
733 } else {
734 console.log(error);
735 }
736 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700737 },
beccabroekbfc99902018-07-24 15:36:33 -0500738 getLastRebootTime: function() {
739 return $http({
740 method: 'GET',
741 url: DataService.getHost() +
742 '/xyz/openbmc_project/state/bmc0/attr/LastRebootTime',
beccabroekbfc99902018-07-24 15:36:33 -0500743 withCredentials: true
744 })
745 .then(function(response) {
746 return response.data;
747 });
748 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700749 hostPowerOn: function() {
750 var deferred = $q.defer();
751 $http({
752 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700753 url: DataService.getHost() +
754 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700755 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700756 data: JSON.stringify(
757 {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
758 })
759 .then(
760 function(response) {
761 var json = JSON.stringify(response.data);
762 var content = JSON.parse(json);
763 deferred.resolve(content.status);
764 },
765 function(error) {
766 console.log(error);
767 deferred.reject(error);
768 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700769 return deferred.promise;
770 },
771 hostPowerOff: function() {
772 var deferred = $q.defer();
773 $http({
774 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700775 url: DataService.getHost() +
776 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700777 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700778 data: JSON.stringify(
779 {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
780 })
781 .then(
782 function(response) {
783 var json = JSON.stringify(response.data);
784 var content = JSON.parse(json);
785 deferred.resolve(content.status);
786 },
787 function(error) {
788 console.log(error);
789 deferred.reject(error);
790 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700791 return deferred.promise;
792 },
793 hostReboot: function() {
794 var deferred = $q.defer();
795 $http({
796 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700797 url: DataService.getHost() +
798 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700799 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700800 data: JSON.stringify(
801 {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
802 })
803 .then(
804 function(response) {
805 var json = JSON.stringify(response.data);
806 var content = JSON.parse(json);
807 deferred.resolve(content.status);
808 },
809 function(error) {
810 console.log(error);
811 deferred.reject(error);
812 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700813
814 return deferred.promise;
815 },
816 hostShutdown: function(callback) {
817 $http({
818 method: 'POST',
819 url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700820 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700821 data: JSON.stringify({'data': []})
822 })
823 .then(
824 function(response) {
825 var json = JSON.stringify(response.data);
826 var content = JSON.parse(json);
827 if (callback) {
828 return callback(content);
829 }
830 },
831 function(error) {
832 if (callback) {
833 callback(error);
834 } else {
835 console.log(error);
836 }
837 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700838 },
beccabroek56744252018-08-03 11:25:11 -0500839 getLastPowerTime: function() {
840 return $http({
841 method: 'GET',
842 url: DataService.getHost() +
843 '/xyz/openbmc_project/state/chassis0/attr/LastStateChangeTime',
beccabroek56744252018-08-03 11:25:11 -0500844 withCredentials: true
845 })
846 .then(function(response) {
847 return response.data;
848 });
849 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700850 getLogs: function() {
851 var deferred = $q.defer();
852 $http({
853 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700854 url: DataService.getHost() +
855 '/xyz/openbmc_project/logging/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700856 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700857 })
858 .then(
859 function(response) {
860 var json = JSON.stringify(response.data);
861 var content = JSON.parse(json);
862 var dataClone = JSON.parse(JSON.stringify(content.data));
863 var data = [];
864 var severityCode = '';
865 var priority = '';
866 var health = '';
867 var relatedItems = [];
Matt Spinler845acdc2018-05-01 16:41:28 -0500868 var eventID = 'None';
869 var description = 'None';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700870
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700871 for (var key in content.data) {
872 if (content.data.hasOwnProperty(key) &&
873 content.data[key].hasOwnProperty('Id')) {
874 var severityFlags = {
875 low: false,
876 medium: false,
877 high: false
878 };
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700879 severityCode =
880 content.data[key].Severity.split('.').pop();
881 priority =
882 Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
883 severityFlags[priority.toLowerCase()] = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700884 relatedItems = [];
885 content.data[key].associations.forEach(function(item) {
886 relatedItems.push(item[2]);
887 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700888
Matt Spinler845acdc2018-05-01 16:41:28 -0500889 if (content.data[key].hasOwnProperty(['EventID'])) {
890 eventID = content.data[key].EventID;
891 }
892
893 if (content.data[key].hasOwnProperty(['Description'])) {
894 description = content.data[key].Description;
895 }
896
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700897 data.push(Object.assign(
898 {
899 path: key,
900 copied: false,
901 priority: priority,
902 severity_code: severityCode,
903 severity_flags: severityFlags,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700904 additional_data:
905 content.data[key].AdditionalData.join('\n'),
906 type: content.data[key].Message,
907 selected: false,
908 search_text:
909 ('#' + content.data[key].Id + ' ' +
910 severityCode + ' ' +
Gunnar Mills07876ff2018-06-28 15:21:22 -0500911 content.data[key].Message + ' ' +
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700912 content.data[key].Severity + ' ' +
913 content.data[key].AdditionalData.join(' '))
914 .toLowerCase(),
915 meta: false,
916 confirm: false,
917 related_items: relatedItems,
Matt Spinler845acdc2018-05-01 16:41:28 -0500918 eventID: eventID,
919 description: description,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700920 data: {key: key, value: content.data[key]}
921 },
922 content.data[key]));
923 }
924 }
925 deferred.resolve({data: data, original: dataClone});
926 },
927 function(error) {
928 console.log(error);
929 deferred.reject(error);
930 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700931
932 return deferred.promise;
933 },
934 getAllSensorStatus: function(callback) {
935 $http({
936 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700937 url: DataService.getHost() +
938 '/xyz/openbmc_project/sensors/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700939 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700940 })
941 .then(
942 function(response) {
943 var json = JSON.stringify(response.data);
944 var content = JSON.parse(json);
945 var dataClone = JSON.parse(JSON.stringify(content.data));
946 var sensorData = [];
947 var severity = {};
948 var title = '';
949 var tempKeyParts = [];
950 var order = 0;
951 var customOrder = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700952
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700953 function getSensorStatus(reading) {
954 var severityFlags = {
955 critical: false,
956 warning: false,
957 normal: false
958 },
959 severityText = '', order = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700960
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700961 if (reading.hasOwnProperty('CriticalLow') &&
962 reading.Value < reading.CriticalLow) {
963 severityFlags.critical = true;
964 severityText = 'critical';
965 order = 2;
966 } else if (
967 reading.hasOwnProperty('CriticalHigh') &&
968 reading.Value > reading.CriticalHigh) {
969 severityFlags.critical = true;
970 severityText = 'critical';
971 order = 2;
972 } else if (
973 reading.hasOwnProperty('CriticalLow') &&
974 reading.hasOwnProperty('WarningLow') &&
975 reading.Value >= reading.CriticalLow &&
976 reading.Value <= reading.WarningLow) {
977 severityFlags.warning = true;
978 severityText = 'warning';
979 order = 1;
980 } else if (
981 reading.hasOwnProperty('WarningHigh') &&
982 reading.hasOwnProperty('CriticalHigh') &&
983 reading.Value >= reading.WarningHigh &&
984 reading.Value <= reading.CriticalHigh) {
985 severityFlags.warning = true;
986 severityText = 'warning';
987 order = 1;
988 } else {
989 severityFlags.normal = true;
990 severityText = 'normal';
991 }
992 return {
993 flags: severityFlags,
994 severityText: severityText,
995 order: order
996 };
997 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700998
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700999 for (var key in content.data) {
1000 if (content.data.hasOwnProperty(key) &&
1001 content.data[key].hasOwnProperty('Unit')) {
1002 severity = getSensorStatus(content.data[key]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001003
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001004 if (!content.data[key].hasOwnProperty('CriticalLow')) {
1005 content.data[key].CriticalLow = '--';
1006 content.data[key].CriticalHigh = '--';
1007 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001008
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001009 if (!content.data[key].hasOwnProperty('WarningLow')) {
1010 content.data[key].WarningLow = '--';
1011 content.data[key].WarningHigh = '--';
1012 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001013
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001014 tempKeyParts = key.split('/');
1015 title = tempKeyParts.pop();
1016 title = tempKeyParts.pop() + '_' + title;
1017 title = title.split('_')
1018 .map(function(item) {
1019 return item.toLowerCase()
1020 .charAt(0)
1021 .toUpperCase() +
1022 item.slice(1);
1023 })
1024 .reduce(function(prev, el) {
1025 return prev + ' ' + el;
1026 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001027
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001028 content.data[key].Value = getScaledValue(
1029 content.data[key].Value, content.data[key].Scale);
1030 content.data[key].CriticalLow = getScaledValue(
1031 content.data[key].CriticalLow,
1032 content.data[key].Scale);
1033 content.data[key].CriticalHigh = getScaledValue(
1034 content.data[key].CriticalHigh,
1035 content.data[key].Scale);
1036 content.data[key].WarningLow = getScaledValue(
1037 content.data[key].WarningLow,
1038 content.data[key].Scale);
1039 content.data[key].WarningHigh = getScaledValue(
1040 content.data[key].WarningHigh,
1041 content.data[key].Scale);
1042 if (Constants.SENSOR_SORT_ORDER.indexOf(
1043 content.data[key].Unit) > -1) {
1044 customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
1045 content.data[key].Unit);
1046 } else {
1047 customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
1048 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001049
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001050 sensorData.push(Object.assign(
1051 {
1052 path: key,
1053 selected: false,
1054 confirm: false,
1055 copied: false,
1056 title: title,
1057 unit:
1058 Constants
1059 .SENSOR_UNIT_MAP[content.data[key].Unit],
1060 severity_flags: severity.flags,
1061 status: severity.severityText,
1062 order: severity.order,
1063 custom_order: customOrder,
1064 search_text:
1065 (title + ' ' + content.data[key].Value + ' ' +
1066 Constants.SENSOR_UNIT_MAP[content.data[key]
1067 .Unit] +
1068 ' ' + severity.severityText + ' ' +
1069 content.data[key].CriticalLow + ' ' +
1070 content.data[key].CriticalHigh + ' ' +
1071 content.data[key].WarningLow + ' ' +
1072 content.data[key].WarningHigh + ' ')
1073 .toLowerCase(),
1074 original_data:
1075 {key: key, value: content.data[key]}
1076 },
1077 content.data[key]));
1078 }
1079 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001080
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001081 callback(sensorData, dataClone);
1082 },
1083 function(error) {
1084 console.log(error);
1085 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001086 },
1087 getActivation: function(imageId) {
1088 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001089 method: 'GET',
1090 url: DataService.getHost() +
1091 '/xyz/openbmc_project/software/' + imageId +
1092 '/attr/Activation',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001093 withCredentials: true
1094 })
1095 .then(function(response) {
1096 return response.data;
1097 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001098 },
1099 getFirmwares: function() {
1100 var deferred = $q.defer();
1101 $http({
1102 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001103 url: DataService.getHost() +
1104 '/xyz/openbmc_project/software/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001105 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001106 })
1107 .then(
1108 function(response) {
1109 var json = JSON.stringify(response.data);
1110 var content = JSON.parse(json);
1111 var data = [];
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001112 var isExtended = false;
1113 var bmcActiveVersion = '';
1114 var hostActiveVersion = '';
1115 var imageType = '';
1116 var extendedVersions = [];
1117 var functionalImages = [];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001118
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001119 function getFormatedExtendedVersions(extendedVersion) {
1120 var versions = [];
1121 extendedVersion = extendedVersion.split(',');
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001122
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001123 extendedVersion.forEach(function(item) {
1124 var parts = item.split('-');
1125 var numberIndex = 0;
1126 for (var i = 0; i < parts.length; i++) {
1127 if (/[0-9]/.test(parts[i])) {
1128 numberIndex = i;
1129 break;
1130 }
1131 }
1132 var titlePart = parts.splice(0, numberIndex);
1133 titlePart = titlePart.join('');
1134 titlePart = titlePart[0].toUpperCase() +
1135 titlePart.substr(1, titlePart.length);
1136 var versionPart = parts.join('-');
1137 versions.push({title: titlePart, version: versionPart});
1138 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001139
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001140 return versions;
1141 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001142
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001143 // Get the list of functional images so we can compare
1144 // later if an image is functional
1145 if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
1146 functionalImages =
1147 content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
1148 .endpoints;
1149 }
1150 for (var key in content.data) {
1151 if (content.data.hasOwnProperty(key) &&
1152 content.data[key].hasOwnProperty('Version')) {
Gunnar Millsac9131e2018-07-13 15:52:18 -05001153 var activationStatus = '';
1154
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001155 // If the image is "Functional" use that for the
AppaRao Puli28711a62018-10-17 16:07:55 +05301156 // activation status, else use the value of
1157 // "Activation"
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001158 // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
Gunnar Millsac9131e2018-07-13 15:52:18 -05001159 if (content.data[key].Activation) {
1160 activationStatus =
1161 content.data[key].Activation.split('.').pop();
1162 }
1163
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001164 if (functionalImages.includes(key)) {
1165 activationStatus = 'Functional';
1166 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001167
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001168 imageType = content.data[key].Purpose.split('.').pop();
1169 isExtended = content.data[key].hasOwnProperty(
1170 'ExtendedVersion') &&
1171 content.data[key].ExtendedVersion != '';
1172 if (isExtended) {
1173 extendedVersions = getFormatedExtendedVersions(
1174 content.data[key].ExtendedVersion);
1175 }
1176 data.push(Object.assign(
1177 {
1178 path: key,
1179 activationStatus: activationStatus,
1180 imageId: key.split('/').pop(),
1181 imageType: imageType,
1182 isExtended: isExtended,
1183 extended:
1184 {show: false, versions: extendedVersions},
1185 data: {key: key, value: content.data[key]}
1186 },
1187 content.data[key]));
1188
1189 if (activationStatus == 'Functional' &&
1190 imageType == 'BMC') {
1191 bmcActiveVersion = content.data[key].Version;
1192 }
1193
1194 if (activationStatus == 'Functional' &&
1195 imageType == 'Host') {
1196 hostActiveVersion = content.data[key].Version;
1197 }
1198 }
1199 }
1200
1201 deferred.resolve({
1202 data: data,
1203 bmcActiveVersion: bmcActiveVersion,
1204 hostActiveVersion: hostActiveVersion
1205 });
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001206 },
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001207 function(error) {
1208 console.log(error);
1209 deferred.reject(error);
1210 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001211
1212 return deferred.promise;
1213 },
1214 changePriority: function(imageId, priority) {
Gunnar Millsf7f59462018-09-20 16:02:08 -05001215 return $http({
1216 method: 'PUT',
1217 url: DataService.getHost() +
1218 '/xyz/openbmc_project/software/' + imageId +
1219 '/attr/Priority',
1220 withCredentials: true,
1221 data: JSON.stringify({'data': priority})
1222 })
1223 .then(function(response) {
1224 return response.data;
1225 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001226 },
1227 deleteImage: function(imageId) {
Gunnar Millsf7f59462018-09-20 16:02:08 -05001228 return $http({
1229 method: 'POST',
1230 url: DataService.getHost() +
1231 '/xyz/openbmc_project/software/' + imageId +
1232 '/action/Delete',
1233 withCredentials: true,
1234 data: JSON.stringify({'data': []})
1235 })
1236 .then(function(response) {
1237 return response.data;
1238 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001239 },
1240 activateImage: function(imageId) {
Gunnar Millsf7f59462018-09-20 16:02:08 -05001241 return $http({
1242 method: 'PUT',
1243 url: DataService.getHost() +
1244 '/xyz/openbmc_project/software/' + imageId +
1245 '/attr/RequestedActivation',
1246 withCredentials: true,
1247 data: JSON.stringify(
1248 {'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1249 })
1250 .then(function(response) {
1251 return response.data;
1252 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001253 },
1254 uploadImage: function(file) {
1255 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001256 method: 'POST',
1257 timeout: 5 * 60 * 1000,
1258 url: DataService.getHost() + '/upload/image',
Gunnar Millsdd9d4c32018-09-10 12:59:34 -05001259 // Overwrite the default 'application/json' Content-Type
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001260 headers: {'Content-Type': 'application/octet-stream'},
1261 withCredentials: true,
1262 data: file
1263 })
1264 .then(function(response) {
1265 return response.data;
1266 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001267 },
1268 downloadImage: function(host, filename) {
1269 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001270 method: 'POST',
1271 url: DataService.getHost() +
1272 '/xyz/openbmc_project/software/action/DownloadViaTFTP',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001273 withCredentials: true,
1274 data: JSON.stringify({'data': [filename, host]}),
1275 responseType: 'arraybuffer'
1276 })
1277 .then(function(response) {
1278 return response.data;
1279 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001280 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001281 getServerInfo: function() {
1282 // TODO: openbmc/openbmc#3117 Need a way via REST to get
1283 // interfaces so we can get the system object(s) by the looking
1284 // for the system interface.
1285 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001286 method: 'GET',
1287 url: DataService.getHost() +
1288 '/xyz/openbmc_project/inventory/system',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001289 withCredentials: true
1290 })
1291 .then(function(response) {
1292 return response.data;
1293 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001294 },
1295 getBMCTime: function() {
1296 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001297 method: 'GET',
1298 url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001299 withCredentials: true
1300 })
1301 .then(function(response) {
1302 return response.data;
1303 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001304 },
Gunnar Millsc74d4342018-07-18 14:52:02 -05001305 getTime: function() {
1306 return $http({
1307 method: 'GET',
1308 url: DataService.getHost() +
1309 '/xyz/openbmc_project/time/enumerate',
Gunnar Millsc74d4342018-07-18 14:52:02 -05001310 withCredentials: true
1311 })
1312 .then(function(response) {
1313 return response.data;
1314 });
1315 },
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001316 // Even though NTPServers is a network interface specific path
1317 // (e.g. /xyz/openbmc_project/network/eth0/attr/NTPServers) it acts
1318 // like a global setting. Just use eth0 for setting and getting the
1319 // NTP Servers until it is moved to a non-network interface specific
1320 // path like it is in Redfish. TODO: openbmc/phosphor-time-manager#4
1321 getNTPServers: function() {
1322 return $http({
1323 method: 'GET',
1324 url: DataService.getHost() +
1325 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001326 withCredentials: true
1327 })
1328 .then(function(response) {
1329 return response.data;
1330 });
1331 },
1332 setNTPServers: function(ntpServers) {
1333 return $http({
1334 method: 'PUT',
1335 url: DataService.getHost() +
1336 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001337 withCredentials: true,
1338 data: JSON.stringify({'data': ntpServers})
1339 })
1340 .then(function(response) {
1341 return response.data;
1342 });
1343 },
1344 setTimeMode: function(timeMode) {
1345 return $http({
1346 method: 'PUT',
1347 url: DataService.getHost() +
1348 '/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001349 withCredentials: true,
1350 data: JSON.stringify({'data': timeMode})
1351 })
1352 .then(function(response) {
1353 return response.data;
1354 });
1355 },
1356 setTimeOwner: function(timeOwner) {
1357 return $http({
1358 method: 'PUT',
1359 url: DataService.getHost() +
1360 '/xyz/openbmc_project/time/owner/attr/TimeOwner',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001361 withCredentials: true,
1362 data: JSON.stringify({'data': timeOwner})
1363 })
1364 .then(function(response) {
1365 return response.data;
1366 });
1367 },
1368 setBMCTime: function(time) {
1369 return $http({
1370 method: 'PUT',
1371 url: DataService.getHost() +
1372 '/xyz/openbmc_project/time/bmc/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001373 withCredentials: true,
1374 data: JSON.stringify({'data': time})
1375 })
1376 .then(function(response) {
1377 return response.data;
1378 });
1379 },
1380 setHostTime: function(time) {
1381 return $http({
1382 method: 'PUT',
1383 url: DataService.getHost() +
1384 '/xyz/openbmc_project/time/host/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001385 withCredentials: true,
1386 data: JSON.stringify({'data': time})
1387 })
1388 .then(function(response) {
1389 return response.data;
1390 });
1391 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001392 getHardwares: function(callback) {
1393 $http({
1394 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001395 url: DataService.getHost() +
1396 '/xyz/openbmc_project/inventory/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001397 withCredentials: true
1398 }).then(function(response) {
1399 var json = JSON.stringify(response.data);
1400 var content = JSON.parse(json);
1401 var hardwareData = [];
1402 var keyIndexMap = {};
1403 var title = '';
beccabroek628ba8b2018-10-01 14:12:25 -05001404 var depth = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001405 var data = [];
1406 var searchText = '';
1407 var componentIndex = -1;
beccabroek628ba8b2018-10-01 14:12:25 -05001408 var parent = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001409
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001410 function isSubComponent(key) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001411 for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1412 i++) {
1413 if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1414 2)
1415 return true;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001416 }
1417
1418 return false;
1419 }
1420
1421 function titlelize(title) {
1422 title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001423 for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1424 i++) {
1425 if (title.toLowerCase().indexOf(
1426 (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001427 return title.toUpperCase();
1428 }
1429 }
1430
1431 return title;
1432 }
1433
1434 function camelcaseToLabel(obj) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001435 var transformed = [], label = '', value = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001436 for (var key in obj) {
1437 label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1438 if (obj[key] !== '') {
1439 value = obj[key];
1440 if (value == 1 || value == 0) {
1441 value = (value == 1) ? 'Yes' : 'No';
1442 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001443 transformed.push({key: label, value: value});
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001444 }
1445 }
1446
1447 return transformed;
1448 }
1449
beccabroek628ba8b2018-10-01 14:12:25 -05001450 function determineParent(key) {
1451 var levels = key.split('/');
1452 levels.pop();
1453 return levels.join('/');
1454 }
1455
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001456 function getSearchText(data) {
1457 var searchText = '';
1458 for (var i = 0; i < data.length; i++) {
1459 searchText += ' ' + data[i].key + ' ' + data[i].value;
1460 }
1461
1462 return searchText;
1463 }
1464
1465 for (var key in content.data) {
1466 if (content.data.hasOwnProperty(key) &&
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001467 key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001468 data = camelcaseToLabel(content.data[key]);
1469 searchText = getSearchText(data);
1470 title = key.split('/').pop();
Gunnar Millseedf0b92019-02-27 10:52:01 -06001471 // All and only associations have the property "endpoints".
1472 // We don't want to show associations on the hardware page.
1473 // Example: An association from the BMC inventory item to the
1474 // BMC firmware images.
1475 if (content.data[key].hasOwnProperty('endpoints')) {
1476 continue;
1477 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001478
1479 title = titlelize(title);
beccabroek628ba8b2018-10-01 14:12:25 -05001480 // e.g. /xyz/openbmc_project/inventory/system and
1481 // /xyz/openbmc_project/inventory/system/chassis are depths of 5
1482 // and 6.
1483 depth = key.split('/').length;
1484 parent = determineParent(key);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001485
1486 if (!isSubComponent(key)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001487 hardwareData.push(Object.assign(
1488 {
1489 path: key,
1490 title: title,
beccabroek628ba8b2018-10-01 14:12:25 -05001491 depth: depth,
1492 parent: parent,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001493 selected: false,
1494 expanded: false,
1495 search_text: title.toLowerCase() + ' ' +
1496 searchText.toLowerCase(),
1497 sub_components: [],
1498 original_data: {key: key, value: content.data[key]}
1499 },
1500 {items: data}));
Iftekharul Islam2a489552017-11-02 13:23:08 -05001501
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001502 keyIndexMap[key] = hardwareData.length - 1;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001503 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001504 parent = determineParent(key)
1505 componentIndex = keyIndexMap[parent];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001506 data = content.data[key];
1507 data.title = title;
1508 hardwareData[componentIndex].sub_components.push(data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001509 hardwareData[componentIndex].search_text +=
1510 ' ' + title.toLowerCase();
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001511
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001512 // Sort the subcomponents alphanumeric so they are displayed
1513 // on the inventory page in order (e.g. core 0, core 1, core
1514 // 2, ... core 12, core 13)
1515 hardwareData[componentIndex].sub_components.sort(function(
1516 a, b) {
1517 return a.title.localeCompare(
1518 b.title, 'en', {numeric: true});
Gunnar Mills55a8e392018-03-14 15:37:44 -05001519 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001520 }
1521 }
1522 }
beccabroek628ba8b2018-10-01 14:12:25 -05001523 // First, order the components by depth and then place the child
1524 // components beneath their parent component alphanumerically. Can
1525 // be removed with completion of
1526 // https://github.com/openbmc/openbmc/issues/3401
1527 // TODO: Remove this once implemented in back end
1528 hardwareData.sort(function(a, b) {
1529 if (a.depth < b.depth) return -1;
1530 if (a.depth > b.depth) return 1;
1531 return b.title.localeCompare(a.title, 'en', {numeric: true});
1532 });
1533
1534 var orderedComponents = [];
1535
1536 for (var i = 0; i < hardwareData.length; i++) {
1537 if (!keyIndexMap[hardwareData[i].parent]) {
1538 orderedComponents.push(hardwareData[i]);
1539 } else {
1540 for (var j = 0; j < orderedComponents.length; j++) {
1541 if (orderedComponents[j].path === hardwareData[i].parent) {
1542 var child = hardwareData[i];
1543 orderedComponents.splice(j + 1, 0, child);
1544 }
1545 }
1546 }
1547 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001548
1549 if (callback) {
beccabroek628ba8b2018-10-01 14:12:25 -05001550 callback(orderedComponents, content.data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001551 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001552 return {data: orderedComponents, original_data: content.data};
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001553 }
1554 });
1555 },
1556 deleteLogs: function(logs) {
1557 var defer = $q.defer();
1558 var promises = [];
1559
1560 function finished() {
1561 defer.resolve();
1562 }
1563
1564 logs.forEach(function(item) {
1565 promises.push($http({
1566 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001567 url: DataService.getHost() +
1568 '/xyz/openbmc_project/logging/entry/' + item.Id +
1569 '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001570 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001571 data: JSON.stringify({'data': []})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001572 }));
1573 });
1574
1575 $q.all(promises).then(finished);
1576
1577 return defer.promise;
1578 },
1579 resolveLogs: function(logs) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001580 var promises = [];
1581
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001582 logs.forEach(function(item) {
1583 promises.push($http({
1584 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001585 url: DataService.getHost() +
1586 '/xyz/openbmc_project/logging/entry/' + item.Id +
1587 '/attr/Resolved',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001588 withCredentials: true,
Gunnar Mills7e48d082019-01-23 16:02:03 -06001589 data: JSON.stringify({'data': true})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001590 }));
1591 });
Gunnar Mills7e48d082019-01-23 16:02:03 -06001592 return $q.all(promises);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001593 },
1594 getPowerConsumption: function() {
1595 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001596 method: 'GET',
1597 url: DataService.getHost() +
1598 '/xyz/openbmc_project/sensors/power/total_power',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001599 withCredentials: true
1600 })
1601 .then(
1602 function(response) {
1603 var json = JSON.stringify(response.data);
1604 var content = JSON.parse(json);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001605
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001606 return getScaledValue(
1607 content.data.Value, content.data.Scale) +
1608 ' ' +
1609 Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1610 },
1611 function(error) {
1612 if ('Not Found' == error.statusText) {
1613 return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1614 } else {
1615 throw error;
1616 }
1617 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001618 },
1619 getPowerCap: function() {
1620 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001621 method: 'GET',
1622 url: DataService.getHost() +
1623 '/xyz/openbmc_project/control/host0/power_cap',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001624 withCredentials: true
1625 })
1626 .then(function(response) {
Gunnar Mills006aaa02018-06-26 16:08:59 -05001627 return response.data;
1628 });
1629 },
1630 setPowerCapEnable: function(powerCapEnable) {
1631 return $http({
1632 method: 'PUT',
1633 url: DataService.getHost() +
1634 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCapEnable',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001635 withCredentials: true,
1636 data: JSON.stringify({'data': powerCapEnable})
1637 })
1638 .then(function(response) {
1639 return response.data;
1640 });
1641 },
1642 setPowerCap: function(powerCap) {
1643 return $http({
1644 method: 'PUT',
1645 url: DataService.getHost() +
1646 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCap',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001647 withCredentials: true,
1648 data: JSON.stringify({'data': powerCap})
1649 })
1650 .then(function(response) {
1651 return response.data;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001652 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001653 },
1654 setHostname: function(hostname) {
1655 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001656 method: 'PUT',
1657 url: DataService.getHost() +
1658 '/xyz/openbmc_project/network/config/attr/HostName',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001659 withCredentials: true,
1660 data: JSON.stringify({'data': hostname})
1661 })
1662 .then(function(response) {
1663 return response.data;
1664 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001665 },
1666 };
1667 return SERVICE;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001668 }
1669 ]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001670})(window.angular);