blob: 091f72b47c8d54c96117055aec348f9f33be45e1 [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,
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070029 HOST_STATE_TEXT: Constants.HOST_STATE,
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070030 LED_STATE: Constants.LED_STATE,
31 LED_STATE_TEXT: Constants.LED_STATE_TEXT,
32 HOST_SESSION_STORAGE_KEY: Constants.API_CREDENTIALS.host_storage_key,
Gunnar Mills65491142018-06-04 14:23:33 -050033 validIPV4IP: function(ip) {
34 // Checks for [0-255].[0-255].[0-255].[0-255]
35 return ip.match(
36 /\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/);
37 },
AppaRao Pulib1289ec2018-11-14 20:33:30 +053038 getRedfishSysName: function() {
39 return $http({
40 method: 'GET',
41 url: DataService.getHost() + '/redfish/v1/Systems',
42 withCredentials: true
43 })
44 .then(
45 function(response) {
46 var sysUrl = response.data['Members'][0]['@odata.id'];
47 return sysUrl.split('/').pop(-1);
48 },
49 function(error) {
50 console.log(JSON.stringify(error));
51 });
52 },
53 getSystemLogs: function(recordType) {
54 var uri = '/redfish/v1/Systems/' + DataService.systemName +
55 '/LogServices/EventLog/Entries';
Tim Lee494c6ed2020-03-18 17:17:27 +080056 if (recordType == 'Oem') {
57 var uri = '/redfish/v1/Systems/' + DataService.systemName +
58 '/LogServices/Crashdump/Entries';
59 }
AppaRao Pulib1289ec2018-11-14 20:33:30 +053060 return $http({
61 method: 'GET',
62 url: DataService.getHost() + uri,
63 withCredentials: true
64 })
65 .then(
66 function(response) {
67 var logEntries = [];
68 angular.forEach(response.data['Members'], function(log) {
69 if (log.hasOwnProperty('EntryType')) {
70 if (log['EntryType'] == recordType) {
71 logEntries.push(log);
72 }
73 }
74 });
75 return logEntries;
76 },
77 function(error) {
78 console.log(JSON.stringify(error));
79 });
80 },
Tim Lee494c6ed2020-03-18 17:17:27 +080081 clearSystemLogs: function(selectedRecordType) {
AppaRao Pulib1289ec2018-11-14 20:33:30 +053082 var uri = '/redfish/v1/Systems/' + DataService.systemName +
83 '/LogServices/EventLog/Actions/LogService.ClearLog';
Tim Lee494c6ed2020-03-18 17:17:27 +080084 if (selectedRecordType == 'Oem') {
85 var uri = '/redfish/v1/Systems/' + DataService.systemName +
86 '/LogServices/Crashdump/Actions/LogService.ClearLog';
87 }
AppaRao Pulib1289ec2018-11-14 20:33:30 +053088 return $http({
89 method: 'POST',
90 url: DataService.getHost() + uri,
91 withCredentials: true
92 });
93 },
Gunnar Mills854fbba2018-09-13 15:41:30 -050094 deleteObject: function(path) {
95 return $http({
96 method: 'POST',
97 url: DataService.getHost() + path + '/action/Delete',
98 withCredentials: true,
99 data: JSON.stringify({'data': []})
100 })
101 .then(function(response) {
102 return response.data;
103 });
104 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700105 getHostState: function() {
106 var deferred = $q.defer();
107 $http({
108 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700109 url: DataService.getHost() +
110 '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700111 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700112 })
113 .then(
114 function(response) {
115 var json = JSON.stringify(response.data);
116 var content = JSON.parse(json);
117 deferred.resolve(content.data);
118 },
119 function(error) {
120 console.log(error);
121 deferred.reject(error);
122 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700123 return deferred.promise;
124 },
Gunnar Millsff64c542018-08-24 15:49:09 -0500125 getSNMPManagers: function() {
126 return $http({
127 method: 'GET',
128 url: DataService.getHost() +
129 '/xyz/openbmc_project/network/snmp/manager/enumerate',
Gunnar Millsff64c542018-08-24 15:49:09 -0500130 withCredentials: true
131 })
132 .then(function(response) {
133 return response.data;
134 });
135 },
beccabroekc3abaa92018-08-14 13:47:18 -0500136 pollHostStatusTillOn: function() {
137 var deferred = $q.defer();
138 var hostOnTimeout = setTimeout(function() {
139 ws.close();
140 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
141 }, Constants.TIMEOUT.HOST_ON);
142
143 var ws =
144 new WebSocket('wss://' + DataService.server_id + '/subscribe');
145 var data = JSON.stringify({
146 'paths': ['/xyz/openbmc_project/state/host0'],
147 'interfaces': ['xyz.openbmc_project.State.Host']
148 });
149 ws.onopen = function() {
150 ws.send(data);
151 };
152 ws.onmessage = function(evt) {
153 var content = JSON.parse(evt.data);
154 var hostState = content.properties.CurrentHostState;
155 if (hostState === Constants.HOST_STATE_TEXT.on_code) {
156 clearTimeout(hostOnTimeout);
157 ws.close();
158 deferred.resolve();
159 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
160 clearTimeout(hostOnTimeout);
161 ws.close();
162 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
163 }
164 };
165 },
166
167 pollHostStatusTilReboot: function() {
168 var deferred = $q.defer();
169 var onState = Constants.HOST_STATE_TEXT.on_code;
170 var offState = Constants.HOST_STATE_TEXT.on_code;
171 var hostTimeout;
172 var setHostTimeout = function(message, timeout) {
173 hostTimeout = setTimeout(function() {
174 ws.close();
175 deferred.reject(new Error(message));
176 }, timeout);
177 };
178 var ws =
179 new WebSocket('wss://' + DataService.server_id + '/subscribe');
180 var data = JSON.stringify({
181 'paths': ['/xyz/openbmc_project/state/host0'],
182 'interfaces': ['xyz.openbmc_project.State.Host']
183 });
184 ws.onopen = function() {
185 ws.send(data);
186 };
187 setHostTimeout(
188 Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT,
189 Constants.TIMEOUT.HOST_OFF);
190 var pollState = offState;
191 ws.onmessage = function(evt) {
192 var content = JSON.parse(evt.data);
193 var hostState = content.properties.CurrentHostState;
194 if (hostState === pollState) {
195 if (pollState === offState) {
196 clearTimeout(hostTimeout);
197 pollState = onState;
198 setHostTimeout(
199 Constants.MESSAGES.POLL.HOST_ON_TIMEOUT,
200 Constants.TIMEOUT.HOST_ON);
201 }
202 if (pollState === onState) {
203 clearTimeout(hostTimeout);
204 ws.close();
205 deferred.resolve();
206 }
207 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
208 clearTimeout(hostTimeout);
209 ws.close();
210 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
211 }
212 };
213 },
214
215 pollHostStatusTillOff: function() {
216 var deferred = $q.defer();
217 var hostOffTimeout = setTimeout(function() {
218 ws.close();
219 deferred.reject(
220 new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
221 }, Constants.TIMEOUT.HOST_OFF);
222
223 var ws =
224 new WebSocket('wss://' + DataService.server_id + '/subscribe');
225 var data = JSON.stringify({
226 'paths': ['/xyz/openbmc_project/state/host0'],
227 'interfaces': ['xyz.openbmc_project.State.Host']
228 });
229 ws.onopen = function() {
230 ws.send(data);
231 };
232 ws.onmessage = function(evt) {
233 var content = JSON.parse(evt.data);
234 var hostState = content.properties.CurrentHostState;
235 if (hostState === Constants.HOST_STATE_TEXT.off_code) {
236 clearTimeout(hostOffTimeout);
237 ws.close();
238 deferred.resolve();
239 }
240 };
241 },
Gunnar Mills854fbba2018-09-13 15:41:30 -0500242 addSNMPManager: function(address, port) {
243 return $http({
244 method: 'POST',
245 url: DataService.getHost() +
246 '/xyz/openbmc_project/network/snmp/manager/action/Client',
247 withCredentials: true,
248 data: JSON.stringify({'data': [address, +port]})
249 })
250 .then(function(response) {
251 return response.data;
252 });
253 },
254 setSNMPManagerPort: function(snmpManagerPath, port) {
255 return $http({
256 method: 'PUT',
257 url: DataService.getHost() + snmpManagerPath + '/attr/Port',
258 withCredentials: true,
259 data: JSON.stringify({'data': +port})
260 })
261 .then(function(response) {
262 return response.data;
263 });
264 },
265 setSNMPManagerAddress: function(snmpManagerPath, address) {
266 return $http({
267 method: 'PUT',
268 url: DataService.getHost() + snmpManagerPath +
269 '/attr/Address',
270 withCredentials: true,
271 data: JSON.stringify({'data': address})
272 })
273 .then(function(response) {
274 return response.data;
275 });
276 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700277 getNetworkInfo: function() {
278 var deferred = $q.defer();
279 $http({
280 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700281 url: DataService.getHost() +
282 '/xyz/openbmc_project/network/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700283 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700284 })
285 .then(
286 function(response) {
287 var json = JSON.stringify(response.data);
288 var content = JSON.parse(json);
289 var hostname = '';
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500290 var defaultgateway = '';
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700291 var macAddress = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700292
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700293 function parseNetworkData(content) {
294 var data = {
295 interface_ids: [],
296 interfaces: {},
297 ip_addresses: {ipv4: [], ipv6: []},
298 };
299 var interfaceId = '', keyParts = [], interfaceHash = '',
300 interfaceType = '';
301 for (var key in content.data) {
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500302 if (key.match(/network\/eth\d+(_\d+)?$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700303 interfaceId = key.split('/').pop();
304 if (data.interface_ids.indexOf(interfaceId) == -1) {
305 data.interface_ids.push(interfaceId);
306 data.interfaces[interfaceId] = {
307 interfaceIname: '',
308 DomainName: '',
309 MACAddress: '',
310 Nameservers: [],
311 DHCPEnabled: 0,
312 ipv4: {ids: [], values: []},
313 ipv6: {ids: [], values: []}
314 };
315 data.interfaces[interfaceId].MACAddress =
316 content.data[key].MACAddress;
317 data.interfaces[interfaceId].DomainName =
318 content.data[key].DomainName.join(' ');
319 data.interfaces[interfaceId].Nameservers =
320 content.data[key].Nameservers;
321 data.interfaces[interfaceId].DHCPEnabled =
322 content.data[key].DHCPEnabled;
323 }
324 } else if (
325 key.match(
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500326 /network\/eth\d+(_\d+)?\/ipv[4|6]\/[a-z0-9]+$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700327 keyParts = key.split('/');
328 interfaceHash = keyParts.pop();
329 interfaceType = keyParts.pop();
330 interfaceId = keyParts.pop();
331
332 if (data.interfaces[interfaceId][interfaceType]
333 .ids.indexOf(interfaceHash) == -1) {
334 data.interfaces[interfaceId][interfaceType]
335 .ids.push(interfaceHash);
336 data.interfaces[interfaceId][interfaceType]
337 .values.push(content.data[key]);
338 data.ip_addresses[interfaceType].push(
339 content.data[key]['Address']);
340 }
341 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700342 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700343 return data;
344 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700345
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700346 if (content.data.hasOwnProperty(
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500347 '/xyz/openbmc_project/network/config')) {
348 if (content.data['/xyz/openbmc_project/network/config']
349 .hasOwnProperty('HostName')) {
350 hostname =
351 content.data['/xyz/openbmc_project/network/config']
352 .HostName;
353 }
354 if (content.data['/xyz/openbmc_project/network/config']
355 .hasOwnProperty('DefaultGateway')) {
356 defaultgateway =
357 content.data['/xyz/openbmc_project/network/config']
358 .DefaultGateway;
359 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700360 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700361
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700362 if (content.data.hasOwnProperty(
363 '/xyz/openbmc_project/network/eth0') &&
364 content.data['/xyz/openbmc_project/network/eth0']
365 .hasOwnProperty('MACAddress')) {
366 macAddress =
367 content.data['/xyz/openbmc_project/network/eth0']
368 .MACAddress;
369 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700370
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700371 deferred.resolve({
372 data: content.data,
373 hostname: hostname,
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500374 defaultgateway: defaultgateway,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700375 mac_address: macAddress,
376 formatted_data: parseNetworkData(content)
377 });
378 },
379 function(error) {
380 console.log(error);
381 deferred.reject(error);
382 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700383 return deferred.promise;
384 },
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500385 setMACAddress: function(interface_name, mac_address) {
386 return $http({
387 method: 'PUT',
388 url: DataService.getHost() +
389 '/xyz/openbmc_project/network/' + interface_name +
390 '/attr/MACAddress',
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500391 withCredentials: true,
392 data: JSON.stringify({'data': mac_address})
393 })
394 .then(function(response) {
395 return response.data;
396 });
397 },
Gunnar Millsdca79d72018-05-30 13:07:01 -0500398 setDefaultGateway: function(defaultGateway) {
399 return $http({
400 method: 'PUT',
401 url: DataService.getHost() +
402 '/xyz/openbmc_project/network/config/attr/DefaultGateway',
Gunnar Millsdca79d72018-05-30 13:07:01 -0500403 withCredentials: true,
404 data: JSON.stringify({'data': defaultGateway})
405 })
406 .then(function(response) {
407 return response.data;
408 });
409 },
Gunnar Millscb2c3062018-05-31 13:13:30 -0500410 setDHCPEnabled: function(interfaceName, dhcpEnabled) {
411 return $http({
412 method: 'PUT',
413 url: DataService.getHost() +
414 '/xyz/openbmc_project/network/' + interfaceName +
415 '/attr/DHCPEnabled',
Gunnar Millscb2c3062018-05-31 13:13:30 -0500416 withCredentials: true,
417 data: JSON.stringify({'data': dhcpEnabled})
418 })
419 .then(function(response) {
420 return response.data;
421 });
422 },
Gunnar Mills06467822018-06-06 15:43:18 -0500423 setNameservers: function(interfaceName, dnsServers) {
424 return $http({
425 method: 'PUT',
426 url: DataService.getHost() +
427 '/xyz/openbmc_project/network/' + interfaceName +
428 '/attr/Nameservers',
Gunnar Mills06467822018-06-06 15:43:18 -0500429 withCredentials: true,
430 data: JSON.stringify({'data': dnsServers})
431 })
432 .then(function(response) {
433 return response.data;
434 });
435 },
Gunnar Millsa45c3852018-05-30 16:18:45 -0500436 deleteIPV4: function(interfaceName, networkID) {
437 return $http({
438 method: 'POST',
439 url: DataService.getHost() +
440 '/xyz/openbmc_project/network/' + interfaceName +
441 '/ipv4/' + networkID + '/action/Delete',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500442 withCredentials: true,
443 data: JSON.stringify({'data': []})
444 })
445 .then(function(response) {
446 return response.data;
447 });
448 },
449 addIPV4: function(
450 interfaceName, ipAddress, netmaskPrefixLength, gateway) {
451 return $http({
452 method: 'POST',
453 url: DataService.getHost() +
454 '/xyz/openbmc_project/network/' + interfaceName +
455 '/action/IP',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500456 withCredentials: true,
457 data: JSON.stringify({
458 'data': [
459 'xyz.openbmc_project.Network.IP.Protocol.IPv4',
460 ipAddress, +netmaskPrefixLength, gateway
461 ]
462 })
463 })
464 .then(function(response) {
465 return response.data;
466 });
467 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700468 getLEDState: function() {
469 var deferred = $q.defer();
470 $http({
471 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700472 url: DataService.getHost() +
473 '/xyz/openbmc_project/led/groups/enclosure_identify',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700474 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700475 })
476 .then(
477 function(response) {
478 var json = JSON.stringify(response.data);
479 var content = JSON.parse(json);
480 deferred.resolve(content.data.Asserted);
481 },
482 function(error) {
483 console.log(error);
484 deferred.reject(error);
485 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700486 return deferred.promise;
487 },
488 login: function(username, password, callback) {
489 $http({
490 method: 'POST',
491 url: DataService.getHost() + '/login',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700492 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700493 data: JSON.stringify({'data': [username, password]})
494 })
495 .then(
496 function(response) {
497 if (callback) {
498 callback(response.data);
499 }
500 },
501 function(error) {
502 if (callback) {
503 if (error && error.status && error.status == 'error') {
504 callback(error);
505 } else {
506 callback(error, true);
507 }
508 }
509 console.log(error);
510 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700511 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700512 logout: function(callback) {
513 $http({
514 method: 'POST',
515 url: DataService.getHost() + '/logout',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700516 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700517 data: JSON.stringify({'data': []})
518 })
519 .then(
520 function(response) {
521 if (callback) {
522 callback(response.data);
523 }
524 },
525 function(error) {
526 if (callback) {
527 callback(null, error);
528 }
529 console.log(error);
530 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700531 },
AppaRao Pulicf7219c2018-12-27 16:17:46 +0530532 getAccountServiceRoles: function() {
533 var roles = [];
534
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500535 return $http({
536 method: 'GET',
537 url: DataService.getHost() +
538 '/redfish/v1/AccountService/Roles',
539 withCredentials: true
540 })
Yoshie Muranakafa562732019-07-17 11:23:15 -0500541 .then(function(response) {
542 var members = response.data['Members'];
543 angular.forEach(members, function(member) {
544 roles.push(member['@odata.id'].split('/').pop());
545 });
546 return roles;
547 });
AppaRao Pulicf7219c2018-12-27 16:17:46 +0530548 },
549 getAllUserAccounts: function() {
AppaRao Puli28711a62018-10-17 16:07:55 +0530550 var deferred = $q.defer();
551 var promises = [];
AppaRao Puli28711a62018-10-17 16:07:55 +0530552
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500553 $http({
554 method: 'GET',
555 url: DataService.getHost() + '/redfish/v1/AccountService/Accounts',
556 withCredentials: true
557 })
558 .then(
559 function(response) {
560 var members = response.data['Members'];
561 angular.forEach(members, function(member) {
562 promises.push(
563 $http({
564 method: 'GET',
565 url: DataService.getHost() + member['@odata.id'],
566 withCredentials: true
567 }).then(function(res) {
568 return res.data;
AppaRao Puli28711a62018-10-17 16:07:55 +0530569 }));
AppaRao Puli28711a62018-10-17 16:07:55 +0530570 });
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500571
572 $q.all(promises).then(
573 function(results) {
574 deferred.resolve(results);
575 },
576 function(errors) {
577 deferred.reject(errors);
578 });
579 },
580 function(error) {
581 console.log(error);
582 deferred.reject(error);
583 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530584 return deferred.promise;
585 },
AppaRao Pulib1e7c862019-03-12 14:56:40 +0530586
Yoshie Muranakafa562732019-07-17 11:23:15 -0500587 getAllUserAccountProperties: function() {
AppaRao Pulib1e7c862019-03-12 14:56:40 +0530588 return $http({
589 method: 'GET',
590 url: DataService.getHost() + '/redfish/v1/AccountService',
591 withCredentials: true
592 })
Yoshie Muranakafa562732019-07-17 11:23:15 -0500593 .then(function(response) {
594 return response.data;
595 });
AppaRao Pulib1e7c862019-03-12 14:56:40 +0530596 },
597
598 saveUserAccountProperties: function(lockoutduration, lockoutthreshold) {
599 var data = {};
600 if (lockoutduration != undefined) {
601 data['AccountLockoutDuration'] = lockoutduration;
602 }
603 if (lockoutthreshold != undefined) {
604 data['AccountLockoutThreshold'] = lockoutthreshold;
605 }
606
607 return $http({
608 method: 'PATCH',
609 url: DataService.getHost() + '/redfish/v1/AccountService',
610 withCredentials: true,
611 data: data
612 });
613 },
614
beccabroek5e258e42018-11-07 12:22:31 -0600615 saveLdapProperties: function(properties) {
616 return $http({
617 method: 'PATCH',
618 url: DataService.getHost() + '/redfish/v1/AccountService',
619 withCredentials: true,
620 data: properties
621 });
622 },
AppaRao Puli28711a62018-10-17 16:07:55 +0530623 createUser: function(user, passwd, role, enabled) {
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500624 var data = {};
625 data['UserName'] = user;
626 data['Password'] = passwd;
627 data['RoleId'] = role;
628 data['Enabled'] = enabled;
AppaRao Puli28711a62018-10-17 16:07:55 +0530629
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500630 return $http({
631 method: 'POST',
632 url: DataService.getHost() + '/redfish/v1/AccountService/Accounts',
633 withCredentials: true,
634 data: data
635 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530636 },
Yoshie Muranakab4d9c092019-08-01 16:19:40 -0500637 updateUser: function(user, newUser, passwd, role, enabled, locked) {
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500638 var data = {};
639 if ((newUser !== undefined) && (newUser != null)) {
640 data['UserName'] = newUser;
AppaRao Puli28711a62018-10-17 16:07:55 +0530641 }
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500642 if ((role !== undefined) && (role != null)) {
643 data['RoleId'] = role;
644 }
645 if ((enabled !== undefined) && (enabled != null)) {
646 data['Enabled'] = enabled;
647 }
648 if ((passwd !== undefined) && (passwd != null)) {
649 data['Password'] = passwd;
650 }
Yoshie Muranakab4d9c092019-08-01 16:19:40 -0500651 if ((locked !== undefined) && (locked !== null)) {
652 data['Locked'] = locked
653 }
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500654 return $http({
655 method: 'PATCH',
656 url: DataService.getHost() +
657 '/redfish/v1/AccountService/Accounts/' + user,
658 withCredentials: true,
659 data: data
660 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530661 },
662 deleteUser: function(user) {
Gunnar Mills4693ddb2019-03-27 15:49:40 -0500663 return $http({
664 method: 'DELETE',
665 url: DataService.getHost() +
666 '/redfish/v1/AccountService/Accounts/' + user,
667 withCredentials: true,
668 });
AppaRao Puli28711a62018-10-17 16:07:55 +0530669 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700670 chassisPowerOff: function() {
671 var deferred = $q.defer();
672 $http({
673 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700674 url: DataService.getHost() +
675 '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700676 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700677 data: JSON.stringify(
678 {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
679 })
680 .then(
681 function(response) {
682 var json = JSON.stringify(response.data);
683 var content = JSON.parse(json);
684 deferred.resolve(content.status);
685 },
686 function(error) {
687 console.log(error);
688 deferred.reject(error);
689 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700690 return deferred.promise;
691 },
beccabroekb7f0ee12019-01-10 11:15:58 -0600692 setLEDState: function(state) {
693 return $http({
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700694 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700695 url: DataService.getHost() +
696 '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700697 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700698 data: JSON.stringify({'data': state})
699 })
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700700 },
Dixsie Wolmerse3681082019-06-21 13:48:06 -0500701 getBootOptions: function() {
702 return $http({
703 method: 'GET',
704 url: DataService.getHost() + '/redfish/v1/Systems/system',
705 withCredentials: true
706 })
707 .then(function(response) {
708 return response.data;
709 });
710 },
711 saveBootSettings: function(data) {
712 return $http({
713 method: 'PATCH',
714 url: DataService.getHost() + '/redfish/v1/Systems/system',
715 withCredentials: true,
716 data: data
717 });
718 },
719 getTPMStatus: function() {
720 return $http({
721 method: 'GET',
722 url: DataService.getHost() +
723 '/xyz/openbmc_project/control/host0/TPMEnable',
724 withCredentials: true
725 })
726 .then(function(response) {
727 return response.data;
728 });
729 },
730 saveTPMEnable: function(data) {
731 return $http({
732 method: 'PUT',
733 url: DataService.getHost() +
734 '/xyz/openbmc_project/control/host0/TPMEnable/attr/TPMEnable',
735 withCredentials: true,
736 data: JSON.stringify({'data': data})
737 })
738 },
739
Dixsie Wolmersc57ec322019-04-26 12:58:51 -0500740 bmcReboot: function() {
741 return $http({
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700742 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700743 url: DataService.getHost() +
Gunnar Mills70086982019-01-04 15:10:04 -0600744 '/xyz/openbmc_project/state/bmc0/attr/RequestedBMCTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700745 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700746 data: JSON.stringify(
747 {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
Dixsie Wolmersc57ec322019-04-26 12:58:51 -0500748 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700749 },
beccabroekbfc99902018-07-24 15:36:33 -0500750 getLastRebootTime: function() {
751 return $http({
752 method: 'GET',
753 url: DataService.getHost() +
754 '/xyz/openbmc_project/state/bmc0/attr/LastRebootTime',
beccabroekbfc99902018-07-24 15:36:33 -0500755 withCredentials: true
756 })
757 .then(function(response) {
758 return response.data;
759 });
760 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700761 hostPowerOn: function() {
762 var deferred = $q.defer();
763 $http({
764 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700765 url: DataService.getHost() +
766 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700767 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700768 data: JSON.stringify(
769 {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
770 })
771 .then(
772 function(response) {
773 var json = JSON.stringify(response.data);
774 var content = JSON.parse(json);
775 deferred.resolve(content.status);
776 },
777 function(error) {
778 console.log(error);
779 deferred.reject(error);
780 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700781 return deferred.promise;
782 },
783 hostPowerOff: function() {
784 var deferred = $q.defer();
785 $http({
786 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700787 url: DataService.getHost() +
788 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700789 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700790 data: JSON.stringify(
791 {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
792 })
793 .then(
794 function(response) {
795 var json = JSON.stringify(response.data);
796 var content = JSON.parse(json);
797 deferred.resolve(content.status);
798 },
799 function(error) {
800 console.log(error);
801 deferred.reject(error);
802 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700803 return deferred.promise;
804 },
805 hostReboot: function() {
806 var deferred = $q.defer();
807 $http({
808 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700809 url: DataService.getHost() +
810 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700811 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700812 data: JSON.stringify(
813 {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
814 })
815 .then(
816 function(response) {
817 var json = JSON.stringify(response.data);
818 var content = JSON.parse(json);
819 deferred.resolve(content.status);
820 },
821 function(error) {
822 console.log(error);
823 deferred.reject(error);
824 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700825
826 return deferred.promise;
827 },
beccabroek56744252018-08-03 11:25:11 -0500828 getLastPowerTime: function() {
829 return $http({
830 method: 'GET',
831 url: DataService.getHost() +
832 '/xyz/openbmc_project/state/chassis0/attr/LastStateChangeTime',
beccabroek56744252018-08-03 11:25:11 -0500833 withCredentials: true
834 })
835 .then(function(response) {
836 return response.data;
837 });
838 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700839 getLogs: function() {
840 var deferred = $q.defer();
841 $http({
842 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700843 url: DataService.getHost() +
844 '/xyz/openbmc_project/logging/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700845 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700846 })
847 .then(
848 function(response) {
849 var json = JSON.stringify(response.data);
850 var content = JSON.parse(json);
851 var dataClone = JSON.parse(JSON.stringify(content.data));
852 var data = [];
853 var severityCode = '';
854 var priority = '';
855 var health = '';
856 var relatedItems = [];
Matt Spinler845acdc2018-05-01 16:41:28 -0500857 var eventID = 'None';
858 var description = 'None';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700859
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700860 for (var key in content.data) {
861 if (content.data.hasOwnProperty(key) &&
862 content.data[key].hasOwnProperty('Id')) {
863 var severityFlags = {
864 low: false,
865 medium: false,
866 high: false
867 };
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700868 severityCode =
869 content.data[key].Severity.split('.').pop();
870 priority =
871 Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
872 severityFlags[priority.toLowerCase()] = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700873 relatedItems = [];
Gunnar Mills96c498a2019-10-15 15:46:42 -0500874 if (content.data[key].hasOwnProperty(
875 ['Associations'])) {
876 content.data[key].Associations.forEach(function(
877 item) {
878 relatedItems.push(item[2]);
879 });
880 }
Matt Spinler845acdc2018-05-01 16:41:28 -0500881 if (content.data[key].hasOwnProperty(['EventID'])) {
882 eventID = content.data[key].EventID;
883 }
884
885 if (content.data[key].hasOwnProperty(['Description'])) {
886 description = content.data[key].Description;
887 }
888
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700889 data.push(Object.assign(
890 {
891 path: key,
892 copied: false,
893 priority: priority,
894 severity_code: severityCode,
895 severity_flags: severityFlags,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700896 additional_data:
897 content.data[key].AdditionalData.join('\n'),
898 type: content.data[key].Message,
899 selected: false,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700900 meta: false,
901 confirm: false,
902 related_items: relatedItems,
Matt Spinler845acdc2018-05-01 16:41:28 -0500903 eventID: eventID,
904 description: description,
Yoshie Muranakaee788622019-10-02 07:30:16 -0700905 logId: '#' + content.data[key].Id,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700906 data: {key: key, value: content.data[key]}
907 },
908 content.data[key]));
909 }
910 }
911 deferred.resolve({data: data, original: dataClone});
912 },
913 function(error) {
914 console.log(error);
915 deferred.reject(error);
916 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700917
918 return deferred.promise;
919 },
Gunnar Mills615a2f82019-04-17 14:30:39 -0500920 getAllSensorStatus: function(callback) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700921 $http({
922 method: 'GET',
Gunnar Mills615a2f82019-04-17 14:30:39 -0500923 url: DataService.getHost() +
924 '/xyz/openbmc_project/sensors/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700925 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700926 })
927 .then(
928 function(response) {
Gunnar Mills615a2f82019-04-17 14:30:39 -0500929 var json = JSON.stringify(response.data);
930 var content = JSON.parse(json);
931 var dataClone = JSON.parse(JSON.stringify(content.data));
932 var sensorData = [];
933 var severity = {};
934 var title = '';
935 var tempKeyParts = [];
936 var order = 0;
937 var customOrder = 0;
938
939 function getSensorStatus(reading) {
940 var severityFlags = {
941 critical: false,
942 warning: false,
943 normal: false
944 },
945 severityText = '', order = 0;
946
947 if (reading.hasOwnProperty('CriticalLow') &&
948 reading.Value < reading.CriticalLow) {
949 severityFlags.critical = true;
950 severityText = 'critical';
951 order = 2;
952 } else if (
953 reading.hasOwnProperty('CriticalHigh') &&
954 reading.Value > reading.CriticalHigh) {
955 severityFlags.critical = true;
956 severityText = 'critical';
957 order = 2;
958 } else if (
959 reading.hasOwnProperty('CriticalLow') &&
960 reading.hasOwnProperty('WarningLow') &&
961 reading.Value >= reading.CriticalLow &&
962 reading.Value <= reading.WarningLow) {
963 severityFlags.warning = true;
964 severityText = 'warning';
965 order = 1;
966 } else if (
967 reading.hasOwnProperty('WarningHigh') &&
968 reading.hasOwnProperty('CriticalHigh') &&
969 reading.Value >= reading.WarningHigh &&
970 reading.Value <= reading.CriticalHigh) {
971 severityFlags.warning = true;
972 severityText = 'warning';
973 order = 1;
974 } else {
975 severityFlags.normal = true;
976 severityText = 'normal';
977 }
978 return {
979 flags: severityFlags,
980 severityText: severityText,
981 order: order
982 };
983 }
984
985 for (var key in content.data) {
986 if (content.data.hasOwnProperty(key) &&
987 content.data[key].hasOwnProperty('Unit')) {
988 severity = getSensorStatus(content.data[key]);
989
990 if (!content.data[key].hasOwnProperty('CriticalLow')) {
991 content.data[key].CriticalLow = '--';
992 content.data[key].CriticalHigh = '--';
993 }
994
995 if (!content.data[key].hasOwnProperty('WarningLow')) {
996 content.data[key].WarningLow = '--';
997 content.data[key].WarningHigh = '--';
998 }
999
1000 tempKeyParts = key.split('/');
1001 title = tempKeyParts.pop();
1002 title = tempKeyParts.pop() + '_' + title;
1003 title = title.split('_')
1004 .map(function(item) {
1005 return item.toLowerCase()
1006 .charAt(0)
1007 .toUpperCase() +
1008 item.slice(1);
1009 })
1010 .reduce(function(prev, el) {
1011 return prev + ' ' + el;
1012 });
1013
1014 content.data[key].Value = getScaledValue(
1015 content.data[key].Value, content.data[key].Scale);
1016 content.data[key].CriticalLow = getScaledValue(
1017 content.data[key].CriticalLow,
1018 content.data[key].Scale);
1019 content.data[key].CriticalHigh = getScaledValue(
1020 content.data[key].CriticalHigh,
1021 content.data[key].Scale);
1022 content.data[key].WarningLow = getScaledValue(
1023 content.data[key].WarningLow,
1024 content.data[key].Scale);
1025 content.data[key].WarningHigh = getScaledValue(
1026 content.data[key].WarningHigh,
1027 content.data[key].Scale);
1028 if (Constants.SENSOR_SORT_ORDER.indexOf(
1029 content.data[key].Unit) > -1) {
1030 customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
1031 content.data[key].Unit);
1032 } else {
1033 customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
1034 }
1035
1036 sensorData.push(Object.assign(
1037 {
1038 path: key,
1039 selected: false,
1040 confirm: false,
1041 copied: false,
1042 title: title,
1043 unit:
1044 Constants
1045 .SENSOR_UNIT_MAP[content.data[key].Unit],
1046 severity_flags: severity.flags,
1047 status: severity.severityText,
1048 order: severity.order,
1049 custom_order: customOrder,
1050 search_text:
1051 (title + ' ' + content.data[key].Value + ' ' +
1052 Constants.SENSOR_UNIT_MAP[content.data[key]
1053 .Unit] +
1054 ' ' + severity.severityText + ' ' +
1055 content.data[key].CriticalLow + ' ' +
1056 content.data[key].CriticalHigh + ' ' +
1057 content.data[key].WarningLow + ' ' +
1058 content.data[key].WarningHigh + ' ')
1059 .toLowerCase(),
1060 original_data:
1061 {key: key, value: content.data[key]}
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001062 },
Gunnar Mills615a2f82019-04-17 14:30:39 -05001063 content.data[key]));
1064 }
1065 }
1066
Alexander Filippove4ae8542019-06-10 15:42:48 +03001067 sensorData.sort(function(a, b) {
1068 return a.title.localeCompare(
1069 b.title, 'en', {numeric: true});
1070 });
1071
Gunnar Mills615a2f82019-04-17 14:30:39 -05001072 callback(sensorData, dataClone);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001073 },
1074 function(error) {
Gunnar Mills615a2f82019-04-17 14:30:39 -05001075 console.log(error);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001076 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001077 },
1078 getActivation: function(imageId) {
1079 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001080 method: 'GET',
1081 url: DataService.getHost() +
1082 '/xyz/openbmc_project/software/' + imageId +
1083 '/attr/Activation',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001084 withCredentials: true
1085 })
1086 .then(function(response) {
1087 return response.data;
1088 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001089 },
1090 getFirmwares: function() {
1091 var deferred = $q.defer();
1092 $http({
1093 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001094 url: DataService.getHost() +
1095 '/xyz/openbmc_project/software/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001096 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001097 })
1098 .then(
1099 function(response) {
1100 var json = JSON.stringify(response.data);
1101 var content = JSON.parse(json);
1102 var data = [];
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001103 var isExtended = false;
1104 var bmcActiveVersion = '';
1105 var hostActiveVersion = '';
1106 var imageType = '';
1107 var extendedVersions = [];
1108 var functionalImages = [];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001109
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001110 function getFormatedExtendedVersions(extendedVersion) {
1111 var versions = [];
1112 extendedVersion = extendedVersion.split(',');
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001113
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001114 extendedVersion.forEach(function(item) {
1115 var parts = item.split('-');
1116 var numberIndex = 0;
1117 for (var i = 0; i < parts.length; i++) {
1118 if (/[0-9]/.test(parts[i])) {
1119 numberIndex = i;
1120 break;
1121 }
1122 }
George Liu22d78222019-07-19 10:35:40 +08001123 if (numberIndex > 0) {
1124 var titlePart = parts.splice(0, numberIndex);
1125 titlePart = titlePart.join('');
1126 titlePart = titlePart[0].toUpperCase() +
1127 titlePart.substr(1, titlePart.length);
1128 var versionPart = parts.join('-');
1129 versions.push(
1130 {title: titlePart, version: versionPart});
1131 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001132 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001133
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001134 return versions;
1135 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001136
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001137 // Get the list of functional images so we can compare
1138 // later if an image is functional
1139 if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
1140 functionalImages =
1141 content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
1142 .endpoints;
1143 }
1144 for (var key in content.data) {
1145 if (content.data.hasOwnProperty(key) &&
1146 content.data[key].hasOwnProperty('Version')) {
Gunnar Millsac9131e2018-07-13 15:52:18 -05001147 var activationStatus = '';
1148
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001149 // If the image is "Functional" use that for the
AppaRao Puli28711a62018-10-17 16:07:55 +05301150 // activation status, else use the value of
1151 // "Activation"
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001152 // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
Gunnar Millsac9131e2018-07-13 15:52:18 -05001153 if (content.data[key].Activation) {
1154 activationStatus =
1155 content.data[key].Activation.split('.').pop();
1156 }
1157
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001158 if (functionalImages.includes(key)) {
1159 activationStatus = 'Functional';
1160 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001161
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001162 imageType = content.data[key].Purpose.split('.').pop();
1163 isExtended = content.data[key].hasOwnProperty(
1164 'ExtendedVersion') &&
1165 content.data[key].ExtendedVersion != '';
1166 if (isExtended) {
1167 extendedVersions = getFormatedExtendedVersions(
1168 content.data[key].ExtendedVersion);
1169 }
1170 data.push(Object.assign(
1171 {
1172 path: key,
1173 activationStatus: activationStatus,
1174 imageId: key.split('/').pop(),
1175 imageType: imageType,
1176 isExtended: isExtended,
1177 extended:
1178 {show: false, versions: extendedVersions},
1179 data: {key: key, value: content.data[key]}
1180 },
1181 content.data[key]));
1182
1183 if (activationStatus == 'Functional' &&
1184 imageType == 'BMC') {
1185 bmcActiveVersion = content.data[key].Version;
1186 }
1187
1188 if (activationStatus == 'Functional' &&
1189 imageType == 'Host') {
1190 hostActiveVersion = content.data[key].Version;
1191 }
1192 }
1193 }
1194
1195 deferred.resolve({
1196 data: data,
1197 bmcActiveVersion: bmcActiveVersion,
1198 hostActiveVersion: hostActiveVersion
1199 });
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001200 },
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001201 function(error) {
1202 console.log(error);
1203 deferred.reject(error);
1204 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001205
1206 return deferred.promise;
1207 },
1208 changePriority: function(imageId, priority) {
Gunnar Millsf7f59462018-09-20 16:02:08 -05001209 return $http({
1210 method: 'PUT',
1211 url: DataService.getHost() +
1212 '/xyz/openbmc_project/software/' + imageId +
1213 '/attr/Priority',
1214 withCredentials: true,
1215 data: JSON.stringify({'data': priority})
1216 })
1217 .then(function(response) {
1218 return response.data;
1219 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001220 },
1221 deleteImage: function(imageId) {
Gunnar Millsf7f59462018-09-20 16:02:08 -05001222 return $http({
1223 method: 'POST',
1224 url: DataService.getHost() +
1225 '/xyz/openbmc_project/software/' + imageId +
1226 '/action/Delete',
1227 withCredentials: true,
1228 data: JSON.stringify({'data': []})
1229 })
1230 .then(function(response) {
1231 return response.data;
1232 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001233 },
1234 activateImage: function(imageId) {
Gunnar Millsf7f59462018-09-20 16:02:08 -05001235 return $http({
1236 method: 'PUT',
1237 url: DataService.getHost() +
1238 '/xyz/openbmc_project/software/' + imageId +
1239 '/attr/RequestedActivation',
1240 withCredentials: true,
1241 data: JSON.stringify(
1242 {'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1243 })
1244 .then(function(response) {
1245 return response.data;
1246 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001247 },
1248 uploadImage: function(file) {
1249 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001250 method: 'POST',
1251 timeout: 5 * 60 * 1000,
1252 url: DataService.getHost() + '/upload/image',
Gunnar Millsdd9d4c32018-09-10 12:59:34 -05001253 // Overwrite the default 'application/json' Content-Type
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001254 headers: {'Content-Type': 'application/octet-stream'},
1255 withCredentials: true,
1256 data: file
1257 })
1258 .then(function(response) {
1259 return response.data;
1260 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001261 },
1262 downloadImage: function(host, filename) {
1263 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001264 method: 'POST',
1265 url: DataService.getHost() +
1266 '/xyz/openbmc_project/software/action/DownloadViaTFTP',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001267 withCredentials: true,
1268 data: JSON.stringify({'data': [filename, host]}),
1269 responseType: 'arraybuffer'
1270 })
1271 .then(function(response) {
1272 return response.data;
1273 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001274 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001275 getServerInfo: function() {
1276 // TODO: openbmc/openbmc#3117 Need a way via REST to get
1277 // interfaces so we can get the system object(s) by the looking
1278 // for the system interface.
1279 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001280 method: 'GET',
1281 url: DataService.getHost() +
1282 '/xyz/openbmc_project/inventory/system',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001283 withCredentials: true
1284 })
1285 .then(function(response) {
1286 return response.data;
1287 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001288 },
1289 getBMCTime: function() {
1290 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001291 method: 'GET',
1292 url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001293 withCredentials: true
1294 })
1295 .then(function(response) {
1296 return response.data;
1297 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001298 },
Gunnar Millsc74d4342018-07-18 14:52:02 -05001299 getTime: function() {
1300 return $http({
1301 method: 'GET',
1302 url: DataService.getHost() +
1303 '/xyz/openbmc_project/time/enumerate',
Gunnar Millsc74d4342018-07-18 14:52:02 -05001304 withCredentials: true
1305 })
1306 .then(function(response) {
1307 return response.data;
1308 });
1309 },
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001310 // Even though NTPServers is a network interface specific path
1311 // (e.g. /xyz/openbmc_project/network/eth0/attr/NTPServers) it acts
1312 // like a global setting. Just use eth0 for setting and getting the
1313 // NTP Servers until it is moved to a non-network interface specific
1314 // path like it is in Redfish. TODO: openbmc/phosphor-time-manager#4
1315 getNTPServers: function() {
1316 return $http({
1317 method: 'GET',
1318 url: DataService.getHost() +
1319 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001320 withCredentials: true
1321 })
1322 .then(function(response) {
1323 return response.data;
1324 });
1325 },
1326 setNTPServers: function(ntpServers) {
1327 return $http({
1328 method: 'PUT',
1329 url: DataService.getHost() +
1330 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001331 withCredentials: true,
1332 data: JSON.stringify({'data': ntpServers})
1333 })
1334 .then(function(response) {
1335 return response.data;
1336 });
1337 },
1338 setTimeMode: function(timeMode) {
1339 return $http({
1340 method: 'PUT',
1341 url: DataService.getHost() +
1342 '/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001343 withCredentials: true,
1344 data: JSON.stringify({'data': timeMode})
1345 })
1346 .then(function(response) {
1347 return response.data;
1348 });
1349 },
1350 setTimeOwner: function(timeOwner) {
1351 return $http({
1352 method: 'PUT',
1353 url: DataService.getHost() +
1354 '/xyz/openbmc_project/time/owner/attr/TimeOwner',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001355 withCredentials: true,
1356 data: JSON.stringify({'data': timeOwner})
1357 })
1358 .then(function(response) {
1359 return response.data;
1360 });
1361 },
1362 setBMCTime: function(time) {
1363 return $http({
1364 method: 'PUT',
1365 url: DataService.getHost() +
1366 '/xyz/openbmc_project/time/bmc/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001367 withCredentials: true,
1368 data: JSON.stringify({'data': time})
1369 })
1370 .then(function(response) {
1371 return response.data;
1372 });
1373 },
1374 setHostTime: function(time) {
1375 return $http({
1376 method: 'PUT',
1377 url: DataService.getHost() +
1378 '/xyz/openbmc_project/time/host/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001379 withCredentials: true,
1380 data: JSON.stringify({'data': time})
1381 })
1382 .then(function(response) {
1383 return response.data;
1384 });
1385 },
beccabroek309b5da2018-11-07 12:22:31 -06001386 getCertificateLocations: function() {
1387 return $http({
1388 method: 'GET',
1389 url: DataService.getHost() +
1390 '/redfish/v1/CertificateService/CertificateLocations',
1391 withCredentials: true
1392 })
1393 .then(function(response) {
1394 return response.data;
1395 });
1396 },
1397 getCertificate: function(location) {
1398 return $http({
1399 method: 'GET',
1400 url: DataService.getHost() + location,
1401 withCredentials: true
1402 })
1403 .then(function(response) {
1404 return response.data;
1405 });
1406 },
1407 addNewCertificate: function(file, type) {
1408 return $http({
1409 method: 'POST',
1410 url: DataService.getHost() + type.location,
1411 headers: {'Content-Type': 'application/x-pem-file'},
1412 withCredentials: true,
1413 data: file
1414 })
1415 .then(function(response) {
1416 return response.data;
1417 });
1418 },
miramurali235e8785d2019-06-10 15:09:27 -05001419 createCSRCertificate: function(data) {
1420 return $http({
1421 method: 'POST',
1422 url: DataService.getHost() +
1423 '/redfish/v1/CertificateService/Actions/CertificateService.GenerateCSR',
1424 withCredentials: true,
1425 data: data
1426 })
1427 .then(function(response) {
1428 return response.data['CSRString'];
1429 });
1430 },
beccabroek309b5da2018-11-07 12:22:31 -06001431 replaceCertificate: function(data) {
1432 return $http({
1433 method: 'POST',
1434 url: DataService.getHost() +
1435 '/redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate',
1436 withCredentials: true,
1437 data: data
1438 })
1439 .then(function(response) {
1440 return response.data;
1441 });
1442 },
Zbigniew Kurzynskif70f4252019-10-23 14:05:58 +02001443 deleteRedfishObject: function(objectPath) {
1444 return $http({
1445 method: 'DELETE',
1446 url: DataService.getHost() + objectPath,
1447 withCredentials: true
1448 })
1449 .then(function(response) {
1450 return response.data;
1451 });
1452 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001453 getHardwares: function(callback) {
1454 $http({
1455 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001456 url: DataService.getHost() +
1457 '/xyz/openbmc_project/inventory/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001458 withCredentials: true
1459 }).then(function(response) {
1460 var json = JSON.stringify(response.data);
1461 var content = JSON.parse(json);
1462 var hardwareData = [];
1463 var keyIndexMap = {};
1464 var title = '';
beccabroek628ba8b2018-10-01 14:12:25 -05001465 var depth = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001466 var data = [];
1467 var searchText = '';
1468 var componentIndex = -1;
beccabroek628ba8b2018-10-01 14:12:25 -05001469 var parent = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001470
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001471 function isSubComponent(key) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001472 for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1473 i++) {
1474 if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1475 2)
1476 return true;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001477 }
1478
1479 return false;
1480 }
1481
1482 function titlelize(title) {
1483 title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001484 for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1485 i++) {
1486 if (title.toLowerCase().indexOf(
1487 (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001488 return title.toUpperCase();
1489 }
1490 }
1491
1492 return title;
1493 }
1494
1495 function camelcaseToLabel(obj) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001496 var transformed = [], label = '', value = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001497 for (var key in obj) {
1498 label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1499 if (obj[key] !== '') {
1500 value = obj[key];
1501 if (value == 1 || value == 0) {
1502 value = (value == 1) ? 'Yes' : 'No';
1503 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001504 transformed.push({key: label, value: value});
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001505 }
1506 }
1507
1508 return transformed;
1509 }
1510
beccabroek628ba8b2018-10-01 14:12:25 -05001511 function determineParent(key) {
1512 var levels = key.split('/');
1513 levels.pop();
1514 return levels.join('/');
1515 }
1516
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001517 function getSearchText(data) {
1518 var searchText = '';
1519 for (var i = 0; i < data.length; i++) {
1520 searchText += ' ' + data[i].key + ' ' + data[i].value;
1521 }
1522
1523 return searchText;
1524 }
1525
1526 for (var key in content.data) {
1527 if (content.data.hasOwnProperty(key) &&
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001528 key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
Gunnar Millseedf0b92019-02-27 10:52:01 -06001529 // All and only associations have the property "endpoints".
Gunnar Millsc9c8e672019-07-24 17:08:15 -05001530 // We don't want to show forward/reverse association objects
1531 // that the mapper created on the inventory panel.
Gunnar Millseedf0b92019-02-27 10:52:01 -06001532 // Example: An association from the BMC inventory item to the
Gunnar Millsc9c8e672019-07-24 17:08:15 -05001533 // BMC firmware images. See:
Gunnar Mills2ac4eda2019-10-17 12:03:20 -05001534 // https://github.com/openbmc/docs/blob/master/architecture/object-mapper.md#associations
Gunnar Millseedf0b92019-02-27 10:52:01 -06001535 if (content.data[key].hasOwnProperty('endpoints')) {
1536 continue;
1537 }
Gunnar Millsc9c8e672019-07-24 17:08:15 -05001538 // There is also an "Associations" property created by the
1539 // Association interface. These would show on the inventory
1540 // panel under the individual inventory item dropdown. There
1541 // can be a lot of associations in this property and they are
1542 // long, full D-Bus paths. Not particularly useful. Remove
1543 // for now.
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001544
Gunnar Millsc9c8e672019-07-24 17:08:15 -05001545 if (content.data[key].hasOwnProperty('Associations')) {
1546 delete content.data[key].Associations;
1547 }
1548
Gunnar Mills5ccf9e32019-09-19 16:04:46 -05001549 // Remove the Purpose property from any inventory item.
1550 // The purpose property isn't useful to a user.
1551 // E.g. in a Power Supply:
1552 // Purpose
1553 // xyz.openbmc_project.Software.Version.VersionPurpose.Other
1554 // Remove when we move inventory to Redfish
1555 if (content.data[key].hasOwnProperty('Purpose')) {
1556 delete content.data[key].Purpose;
1557 }
1558
Gunnar Millsc9c8e672019-07-24 17:08:15 -05001559 data = camelcaseToLabel(content.data[key]);
1560 searchText = getSearchText(data);
1561 title = key.split('/').pop();
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001562 title = titlelize(title);
beccabroek628ba8b2018-10-01 14:12:25 -05001563 // e.g. /xyz/openbmc_project/inventory/system and
1564 // /xyz/openbmc_project/inventory/system/chassis are depths of 5
1565 // and 6.
1566 depth = key.split('/').length;
1567 parent = determineParent(key);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001568
1569 if (!isSubComponent(key)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001570 hardwareData.push(Object.assign(
1571 {
1572 path: key,
1573 title: title,
beccabroek628ba8b2018-10-01 14:12:25 -05001574 depth: depth,
1575 parent: parent,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001576 selected: false,
1577 expanded: false,
1578 search_text: title.toLowerCase() + ' ' +
1579 searchText.toLowerCase(),
1580 sub_components: [],
1581 original_data: {key: key, value: content.data[key]}
1582 },
1583 {items: data}));
Iftekharul Islam2a489552017-11-02 13:23:08 -05001584
Gunnar Millsc9c8e672019-07-24 17:08:15 -05001585
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001586 keyIndexMap[key] = hardwareData.length - 1;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001587 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001588 parent = determineParent(key)
1589 componentIndex = keyIndexMap[parent];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001590 data = content.data[key];
1591 data.title = title;
1592 hardwareData[componentIndex].sub_components.push(data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001593 hardwareData[componentIndex].search_text +=
1594 ' ' + title.toLowerCase();
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001595
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001596 // Sort the subcomponents alphanumeric so they are displayed
1597 // on the inventory page in order (e.g. core 0, core 1, core
1598 // 2, ... core 12, core 13)
1599 hardwareData[componentIndex].sub_components.sort(function(
1600 a, b) {
1601 return a.title.localeCompare(
1602 b.title, 'en', {numeric: true});
Gunnar Mills55a8e392018-03-14 15:37:44 -05001603 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001604 }
1605 }
1606 }
beccabroek628ba8b2018-10-01 14:12:25 -05001607 // First, order the components by depth and then place the child
1608 // components beneath their parent component alphanumerically. Can
1609 // be removed with completion of
1610 // https://github.com/openbmc/openbmc/issues/3401
1611 // TODO: Remove this once implemented in back end
1612 hardwareData.sort(function(a, b) {
1613 if (a.depth < b.depth) return -1;
1614 if (a.depth > b.depth) return 1;
1615 return b.title.localeCompare(a.title, 'en', {numeric: true});
1616 });
1617
1618 var orderedComponents = [];
1619
1620 for (var i = 0; i < hardwareData.length; i++) {
1621 if (!keyIndexMap[hardwareData[i].parent]) {
1622 orderedComponents.push(hardwareData[i]);
1623 } else {
1624 for (var j = 0; j < orderedComponents.length; j++) {
1625 if (orderedComponents[j].path === hardwareData[i].parent) {
1626 var child = hardwareData[i];
1627 orderedComponents.splice(j + 1, 0, child);
1628 }
1629 }
1630 }
1631 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001632
1633 if (callback) {
beccabroek628ba8b2018-10-01 14:12:25 -05001634 callback(orderedComponents, content.data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001635 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001636 return {data: orderedComponents, original_data: content.data};
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001637 }
1638 });
1639 },
1640 deleteLogs: function(logs) {
1641 var defer = $q.defer();
1642 var promises = [];
1643
1644 function finished() {
1645 defer.resolve();
1646 }
1647
1648 logs.forEach(function(item) {
1649 promises.push($http({
1650 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001651 url: DataService.getHost() +
1652 '/xyz/openbmc_project/logging/entry/' + item.Id +
1653 '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001654 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001655 data: JSON.stringify({'data': []})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001656 }));
1657 });
1658
1659 $q.all(promises).then(finished);
1660
1661 return defer.promise;
1662 },
1663 resolveLogs: function(logs) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001664 var promises = [];
1665
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001666 logs.forEach(function(item) {
1667 promises.push($http({
1668 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001669 url: DataService.getHost() +
1670 '/xyz/openbmc_project/logging/entry/' + item.Id +
1671 '/attr/Resolved',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001672 withCredentials: true,
Gunnar Mills7e48d082019-01-23 16:02:03 -06001673 data: JSON.stringify({'data': true})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001674 }));
1675 });
Gunnar Mills7e48d082019-01-23 16:02:03 -06001676 return $q.all(promises);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001677 },
Yoshie Muranakae4194ce2019-05-24 14:33:56 -05001678 setRemoteLoggingServer: (data) => {
1679 const ip = data.hostname;
1680 const port = data.port;
1681 const setIPRequest = $http({
1682 method: 'PUT',
1683 url: DataService.getHost() +
1684 '/xyz/openbmc_project/logging/config/remote/attr/Address',
1685 withCredentials: true,
1686 data: {'data': ip}
1687 });
1688 const setPortRequest = $http({
1689 method: 'PUT',
1690 url: DataService.getHost() +
1691 '/xyz/openbmc_project/logging/config/remote/attr/Port',
1692 withCredentials: true,
1693 data: {'data': port}
1694 });
1695 const promises = [setIPRequest, setPortRequest];
1696 return $q.all(promises);
1697 },
1698 getRemoteLoggingServer: () => {
1699 return $http({
1700 method: 'GET',
1701 url: DataService.getHost() +
1702 '/xyz/openbmc_project/logging/config/remote',
1703 withCredentials: true
1704 })
1705 .then((response) => {
1706 const remoteServer = response.data.data;
1707 if (remoteServer === undefined) {
1708 return undefined;
1709 }
1710 const hostname = remoteServer.Address;
1711 const port = remoteServer.Port;
1712 if (hostname === '') {
1713 return undefined;
1714 } else {
1715 return {
1716 hostname, port
1717 }
1718 }
1719 });
1720 },
1721 disableRemoteLoggingServer: () => {
1722 return SERVICE.setRemoteLoggingServer({hostname: '', port: 0});
1723 },
1724 updateRemoteLoggingServer: (data) => {
1725 // Recommended to disable existing configuration
1726 // before updating config to new server
1727 // https://github.com/openbmc/phosphor-logging#changing-the-rsyslog-server
1728 return SERVICE.disableRemoteLoggingServer()
1729 .then(() => {
1730 return SERVICE.setRemoteLoggingServer(data);
1731 })
1732 .catch(() => {
1733 // try updating server even if initial disable attempt fails
1734 return SERVICE.setRemoteLoggingServer(data);
1735 });
1736 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001737 getPowerConsumption: function() {
1738 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001739 method: 'GET',
1740 url: DataService.getHost() +
1741 '/xyz/openbmc_project/sensors/power/total_power',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001742 withCredentials: true
1743 })
1744 .then(
1745 function(response) {
1746 var json = JSON.stringify(response.data);
1747 var content = JSON.parse(json);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001748
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001749 return getScaledValue(
1750 content.data.Value, content.data.Scale) +
1751 ' ' +
1752 Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1753 },
1754 function(error) {
1755 if ('Not Found' == error.statusText) {
1756 return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1757 } else {
1758 throw error;
1759 }
1760 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001761 },
1762 getPowerCap: function() {
1763 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001764 method: 'GET',
1765 url: DataService.getHost() +
1766 '/xyz/openbmc_project/control/host0/power_cap',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001767 withCredentials: true
1768 })
1769 .then(function(response) {
Gunnar Mills006aaa02018-06-26 16:08:59 -05001770 return response.data;
1771 });
1772 },
1773 setPowerCapEnable: function(powerCapEnable) {
1774 return $http({
1775 method: 'PUT',
1776 url: DataService.getHost() +
1777 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCapEnable',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001778 withCredentials: true,
1779 data: JSON.stringify({'data': powerCapEnable})
1780 })
1781 .then(function(response) {
1782 return response.data;
1783 });
1784 },
1785 setPowerCap: function(powerCap) {
1786 return $http({
1787 method: 'PUT',
1788 url: DataService.getHost() +
1789 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCap',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001790 withCredentials: true,
1791 data: JSON.stringify({'data': powerCap})
1792 })
1793 .then(function(response) {
1794 return response.data;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001795 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001796 },
1797 setHostname: function(hostname) {
1798 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001799 method: 'PUT',
1800 url: DataService.getHost() +
1801 '/xyz/openbmc_project/network/config/attr/HostName',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001802 withCredentials: true,
1803 data: JSON.stringify({'data': hostname})
1804 })
1805 .then(function(response) {
1806 return response.data;
1807 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001808 },
1809 };
1810 return SERVICE;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001811 }
1812 ]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001813})(window.angular);