blob: beb63ba4e3f53967ac22f542e39e5a87ce1e6da1 [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 },
Gunnar Mills854fbba2018-09-13 15:41:30 -050060 deleteObject: function(path) {
61 return $http({
62 method: 'POST',
63 url: DataService.getHost() + path + '/action/Delete',
64 withCredentials: true,
65 data: JSON.stringify({'data': []})
66 })
67 .then(function(response) {
68 return response.data;
69 });
70 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070071 getHostState: function() {
72 var deferred = $q.defer();
73 $http({
74 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070075 url: DataService.getHost() +
76 '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070077 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070078 })
79 .then(
80 function(response) {
81 var json = JSON.stringify(response.data);
82 var content = JSON.parse(json);
83 deferred.resolve(content.data);
84 },
85 function(error) {
86 console.log(error);
87 deferred.reject(error);
88 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070089 return deferred.promise;
90 },
Gunnar Millsff64c542018-08-24 15:49:09 -050091 getSNMPManagers: function() {
92 return $http({
93 method: 'GET',
94 url: DataService.getHost() +
95 '/xyz/openbmc_project/network/snmp/manager/enumerate',
Gunnar Millsff64c542018-08-24 15:49:09 -050096 withCredentials: true
97 })
98 .then(function(response) {
99 return response.data;
100 });
101 },
beccabroekc3abaa92018-08-14 13:47:18 -0500102 pollHostStatusTillOn: function() {
103 var deferred = $q.defer();
104 var hostOnTimeout = setTimeout(function() {
105 ws.close();
106 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
107 }, Constants.TIMEOUT.HOST_ON);
108
109 var ws =
110 new WebSocket('wss://' + DataService.server_id + '/subscribe');
111 var data = JSON.stringify({
112 'paths': ['/xyz/openbmc_project/state/host0'],
113 'interfaces': ['xyz.openbmc_project.State.Host']
114 });
115 ws.onopen = function() {
116 ws.send(data);
117 };
118 ws.onmessage = function(evt) {
119 var content = JSON.parse(evt.data);
120 var hostState = content.properties.CurrentHostState;
121 if (hostState === Constants.HOST_STATE_TEXT.on_code) {
122 clearTimeout(hostOnTimeout);
123 ws.close();
124 deferred.resolve();
125 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
126 clearTimeout(hostOnTimeout);
127 ws.close();
128 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
129 }
130 };
131 },
132
133 pollHostStatusTilReboot: function() {
134 var deferred = $q.defer();
135 var onState = Constants.HOST_STATE_TEXT.on_code;
136 var offState = Constants.HOST_STATE_TEXT.on_code;
137 var hostTimeout;
138 var setHostTimeout = function(message, timeout) {
139 hostTimeout = setTimeout(function() {
140 ws.close();
141 deferred.reject(new Error(message));
142 }, timeout);
143 };
144 var ws =
145 new WebSocket('wss://' + DataService.server_id + '/subscribe');
146 var data = JSON.stringify({
147 'paths': ['/xyz/openbmc_project/state/host0'],
148 'interfaces': ['xyz.openbmc_project.State.Host']
149 });
150 ws.onopen = function() {
151 ws.send(data);
152 };
153 setHostTimeout(
154 Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT,
155 Constants.TIMEOUT.HOST_OFF);
156 var pollState = offState;
157 ws.onmessage = function(evt) {
158 var content = JSON.parse(evt.data);
159 var hostState = content.properties.CurrentHostState;
160 if (hostState === pollState) {
161 if (pollState === offState) {
162 clearTimeout(hostTimeout);
163 pollState = onState;
164 setHostTimeout(
165 Constants.MESSAGES.POLL.HOST_ON_TIMEOUT,
166 Constants.TIMEOUT.HOST_ON);
167 }
168 if (pollState === onState) {
169 clearTimeout(hostTimeout);
170 ws.close();
171 deferred.resolve();
172 }
173 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
174 clearTimeout(hostTimeout);
175 ws.close();
176 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
177 }
178 };
179 },
180
181 pollHostStatusTillOff: function() {
182 var deferred = $q.defer();
183 var hostOffTimeout = setTimeout(function() {
184 ws.close();
185 deferred.reject(
186 new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
187 }, Constants.TIMEOUT.HOST_OFF);
188
189 var ws =
190 new WebSocket('wss://' + DataService.server_id + '/subscribe');
191 var data = JSON.stringify({
192 'paths': ['/xyz/openbmc_project/state/host0'],
193 'interfaces': ['xyz.openbmc_project.State.Host']
194 });
195 ws.onopen = function() {
196 ws.send(data);
197 };
198 ws.onmessage = function(evt) {
199 var content = JSON.parse(evt.data);
200 var hostState = content.properties.CurrentHostState;
201 if (hostState === Constants.HOST_STATE_TEXT.off_code) {
202 clearTimeout(hostOffTimeout);
203 ws.close();
204 deferred.resolve();
205 }
206 };
207 },
Gunnar Mills854fbba2018-09-13 15:41:30 -0500208 addSNMPManager: function(address, port) {
209 return $http({
210 method: 'POST',
211 url: DataService.getHost() +
212 '/xyz/openbmc_project/network/snmp/manager/action/Client',
213 withCredentials: true,
214 data: JSON.stringify({'data': [address, +port]})
215 })
216 .then(function(response) {
217 return response.data;
218 });
219 },
220 setSNMPManagerPort: function(snmpManagerPath, port) {
221 return $http({
222 method: 'PUT',
223 url: DataService.getHost() + snmpManagerPath + '/attr/Port',
224 withCredentials: true,
225 data: JSON.stringify({'data': +port})
226 })
227 .then(function(response) {
228 return response.data;
229 });
230 },
231 setSNMPManagerAddress: function(snmpManagerPath, address) {
232 return $http({
233 method: 'PUT',
234 url: DataService.getHost() + snmpManagerPath +
235 '/attr/Address',
236 withCredentials: true,
237 data: JSON.stringify({'data': address})
238 })
239 .then(function(response) {
240 return response.data;
241 });
242 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700243 getNetworkInfo: function() {
244 var deferred = $q.defer();
245 $http({
246 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700247 url: DataService.getHost() +
248 '/xyz/openbmc_project/network/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700249 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700250 })
251 .then(
252 function(response) {
253 var json = JSON.stringify(response.data);
254 var content = JSON.parse(json);
255 var hostname = '';
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500256 var defaultgateway = '';
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700257 var macAddress = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700258
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700259 function parseNetworkData(content) {
260 var data = {
261 interface_ids: [],
262 interfaces: {},
263 ip_addresses: {ipv4: [], ipv6: []},
264 };
265 var interfaceId = '', keyParts = [], interfaceHash = '',
266 interfaceType = '';
267 for (var key in content.data) {
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500268 if (key.match(/network\/eth\d+(_\d+)?$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700269 interfaceId = key.split('/').pop();
270 if (data.interface_ids.indexOf(interfaceId) == -1) {
271 data.interface_ids.push(interfaceId);
272 data.interfaces[interfaceId] = {
273 interfaceIname: '',
274 DomainName: '',
275 MACAddress: '',
276 Nameservers: [],
277 DHCPEnabled: 0,
278 ipv4: {ids: [], values: []},
279 ipv6: {ids: [], values: []}
280 };
281 data.interfaces[interfaceId].MACAddress =
282 content.data[key].MACAddress;
283 data.interfaces[interfaceId].DomainName =
284 content.data[key].DomainName.join(' ');
285 data.interfaces[interfaceId].Nameservers =
286 content.data[key].Nameservers;
287 data.interfaces[interfaceId].DHCPEnabled =
288 content.data[key].DHCPEnabled;
289 }
290 } else if (
291 key.match(
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500292 /network\/eth\d+(_\d+)?\/ipv[4|6]\/[a-z0-9]+$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700293 keyParts = key.split('/');
294 interfaceHash = keyParts.pop();
295 interfaceType = keyParts.pop();
296 interfaceId = keyParts.pop();
297
298 if (data.interfaces[interfaceId][interfaceType]
299 .ids.indexOf(interfaceHash) == -1) {
300 data.interfaces[interfaceId][interfaceType]
301 .ids.push(interfaceHash);
302 data.interfaces[interfaceId][interfaceType]
303 .values.push(content.data[key]);
304 data.ip_addresses[interfaceType].push(
305 content.data[key]['Address']);
306 }
307 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700308 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700309 return data;
310 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700311
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700312 if (content.data.hasOwnProperty(
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500313 '/xyz/openbmc_project/network/config')) {
314 if (content.data['/xyz/openbmc_project/network/config']
315 .hasOwnProperty('HostName')) {
316 hostname =
317 content.data['/xyz/openbmc_project/network/config']
318 .HostName;
319 }
320 if (content.data['/xyz/openbmc_project/network/config']
321 .hasOwnProperty('DefaultGateway')) {
322 defaultgateway =
323 content.data['/xyz/openbmc_project/network/config']
324 .DefaultGateway;
325 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700326 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700327
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700328 if (content.data.hasOwnProperty(
329 '/xyz/openbmc_project/network/eth0') &&
330 content.data['/xyz/openbmc_project/network/eth0']
331 .hasOwnProperty('MACAddress')) {
332 macAddress =
333 content.data['/xyz/openbmc_project/network/eth0']
334 .MACAddress;
335 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700336
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700337 deferred.resolve({
338 data: content.data,
339 hostname: hostname,
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500340 defaultgateway: defaultgateway,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700341 mac_address: macAddress,
342 formatted_data: parseNetworkData(content)
343 });
344 },
345 function(error) {
346 console.log(error);
347 deferred.reject(error);
348 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700349 return deferred.promise;
350 },
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500351 setMACAddress: function(interface_name, mac_address) {
352 return $http({
353 method: 'PUT',
354 url: DataService.getHost() +
355 '/xyz/openbmc_project/network/' + interface_name +
356 '/attr/MACAddress',
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500357 withCredentials: true,
358 data: JSON.stringify({'data': mac_address})
359 })
360 .then(function(response) {
361 return response.data;
362 });
363 },
Gunnar Millsdca79d72018-05-30 13:07:01 -0500364 setDefaultGateway: function(defaultGateway) {
365 return $http({
366 method: 'PUT',
367 url: DataService.getHost() +
368 '/xyz/openbmc_project/network/config/attr/DefaultGateway',
Gunnar Millsdca79d72018-05-30 13:07:01 -0500369 withCredentials: true,
370 data: JSON.stringify({'data': defaultGateway})
371 })
372 .then(function(response) {
373 return response.data;
374 });
375 },
Gunnar Millscb2c3062018-05-31 13:13:30 -0500376 setDHCPEnabled: function(interfaceName, dhcpEnabled) {
377 return $http({
378 method: 'PUT',
379 url: DataService.getHost() +
380 '/xyz/openbmc_project/network/' + interfaceName +
381 '/attr/DHCPEnabled',
Gunnar Millscb2c3062018-05-31 13:13:30 -0500382 withCredentials: true,
383 data: JSON.stringify({'data': dhcpEnabled})
384 })
385 .then(function(response) {
386 return response.data;
387 });
388 },
Gunnar Mills06467822018-06-06 15:43:18 -0500389 setNameservers: function(interfaceName, dnsServers) {
390 return $http({
391 method: 'PUT',
392 url: DataService.getHost() +
393 '/xyz/openbmc_project/network/' + interfaceName +
394 '/attr/Nameservers',
Gunnar Mills06467822018-06-06 15:43:18 -0500395 withCredentials: true,
396 data: JSON.stringify({'data': dnsServers})
397 })
398 .then(function(response) {
399 return response.data;
400 });
401 },
Gunnar Millsa45c3852018-05-30 16:18:45 -0500402 deleteIPV4: function(interfaceName, networkID) {
403 return $http({
404 method: 'POST',
405 url: DataService.getHost() +
406 '/xyz/openbmc_project/network/' + interfaceName +
407 '/ipv4/' + networkID + '/action/Delete',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500408 withCredentials: true,
409 data: JSON.stringify({'data': []})
410 })
411 .then(function(response) {
412 return response.data;
413 });
414 },
415 addIPV4: function(
416 interfaceName, ipAddress, netmaskPrefixLength, gateway) {
417 return $http({
418 method: 'POST',
419 url: DataService.getHost() +
420 '/xyz/openbmc_project/network/' + interfaceName +
421 '/action/IP',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500422 withCredentials: true,
423 data: JSON.stringify({
424 'data': [
425 'xyz.openbmc_project.Network.IP.Protocol.IPv4',
426 ipAddress, +netmaskPrefixLength, gateway
427 ]
428 })
429 })
430 .then(function(response) {
431 return response.data;
432 });
433 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700434 getLEDState: function() {
435 var deferred = $q.defer();
436 $http({
437 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700438 url: DataService.getHost() +
439 '/xyz/openbmc_project/led/groups/enclosure_identify',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700440 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700441 })
442 .then(
443 function(response) {
444 var json = JSON.stringify(response.data);
445 var content = JSON.parse(json);
446 deferred.resolve(content.data.Asserted);
447 },
448 function(error) {
449 console.log(error);
450 deferred.reject(error);
451 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700452 return deferred.promise;
453 },
454 login: function(username, password, callback) {
455 $http({
456 method: 'POST',
457 url: DataService.getHost() + '/login',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700458 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700459 data: JSON.stringify({'data': [username, password]})
460 })
461 .then(
462 function(response) {
463 if (callback) {
464 callback(response.data);
465 }
466 },
467 function(error) {
468 if (callback) {
469 if (error && error.status && error.status == 'error') {
470 callback(error);
471 } else {
472 callback(error, true);
473 }
474 }
475 console.log(error);
476 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700477 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700478 logout: function(callback) {
479 $http({
480 method: 'POST',
481 url: DataService.getHost() + '/logout',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700482 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700483 data: JSON.stringify({'data': []})
484 })
485 .then(
486 function(response) {
487 if (callback) {
488 callback(response.data);
489 }
490 },
491 function(error) {
492 if (callback) {
493 callback(null, error);
494 }
495 console.log(error);
496 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700497 },
498 changePassword: function(user, newPassword) {
AppaRao Puli28711a62018-10-17 16:07:55 +0530499 if (DataService.configJson.redfishSupportEnabled == true) {
AppaRao Pulif04960f2018-12-06 21:51:27 +0530500 return $http({
501 method: 'PATCH',
502 url: DataService.getHost() +
503 '/redfish/v1/AccountService/Accounts/' + user,
504 withCredentials: true,
505 data: JSON.stringify({'Password': newPassword})
506 });
507 } else {
508 var deferred = $q.defer();
509 $http({
510 method: 'POST',
511 url: DataService.getHost() + '/xyz/openbmc_project/user/' + user +
512 '/action/SetPassword',
513 withCredentials: true,
514 data: JSON.stringify({'data': [newPassword]}),
515 responseType: 'arraybuffer'
516 })
517 .then(
518 function(response, status, headers) {
519 deferred.resolve(
520 {data: response, status: status, headers: headers});
521 },
522 function(error) {
523 console.log(error);
524 deferred.reject(error);
525 });
526 return deferred.promise;
527 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700528 },
AppaRao Puli28711a62018-10-17 16:07:55 +0530529 getAllUserAccounts: function(members) {
530 var deferred = $q.defer();
531 var promises = [];
532 var users = [];
533
534 if (DataService.configJson.redfishSupportEnabled == true) {
535 $http({
536 method: 'GET',
537 url:
538 DataService.getHost() + '/redfish/v1/AccountService/Accounts',
539 withCredentials: true
540 })
541 .then(
542 function(response) {
543 var members = response.data['Members'];
544 angular.forEach(members, function(member) {
545 promises.push(
546 $http({
547 method: 'GET',
548 url: DataService.getHost() + member['@odata.id'],
549 withCredentials: true
550 }).then(function(res) {
551 return res.data;
552 }));
553 });
554
555 $q.all(promises).then(
556 function(results) {
557 deferred.resolve(results);
558 },
559 function(errors) {
560 deferred.reject(errors);
561 });
562 },
563 function(error) {
564 console.log(error);
565 deferred.reject(error);
566 });
567 } else {
568 $http({
569 method: 'GET',
570 url:
571 DataService.getHost() + '/xyz/openbmc_project/user/enumerate',
572 withCredentials: true
573 })
574 .then(
575 function(response) {
576 var json = JSON.stringify(response.data);
577 var content = JSON.parse(json);
578
579 function convertPrivToRoleId(priv) {
580 if (priv == 'priv-admin') {
581 return 'Administrator';
582 } else if (priv == 'priv-user') {
583 return 'User';
584 } else if (priv == 'priv-operator') {
585 return 'Operator';
586 } else if (priv == 'priv-callback') {
587 return 'Callback';
588 }
589 return '';
590 }
591
592 for (var key in content.data) {
593 var username = key.split('/').pop();
594 if (content.data.hasOwnProperty(key) &&
595 content.data[key].hasOwnProperty('UserPrivilege')) {
596 var val = content.data[key];
597 users.push(Object.assign({
598 Id: username,
599 UserName: username,
600 Locked: val['UserLockedForFailedAttempt'],
601 RoleId: convertPrivToRoleId(val['UserPrivilege']),
602 Enabled: val['UserEnabled'],
603 Password: null
604 }));
605 }
606 }
607 deferred.resolve(users);
608 },
609 function(error) {
610 console.log(error);
611 deferred.reject(error);
612 });
613 }
614 return deferred.promise;
615 },
616 createUser: function(user, passwd, role, enabled) {
617 if (DataService.configJson.redfishSupportEnabled == true) {
618 var data = {};
619 data['UserName'] = user;
620 data['Password'] = passwd;
621 data['RoleId'] = role;
622 data['Enabled'] = enabled;
623
624 return $http({
625 method: 'POST',
626 url:
627 DataService.getHost() + '/redfish/v1/AccountService/Accounts',
628 withCredentials: true,
629 data: data
630 });
631 } else {
632 function convertRoleIdToPriv(roleId) {
633 if (roleId == 'Administrator') {
634 return 'priv-admin';
635 } else if (roleId == 'User') {
636 return 'priv-user';
637 } else if (roleId == 'Operator') {
638 return 'priv-operator';
639 } else if (roleId == 'Callback') {
640 return 'priv-callback';
641 }
642 return '';
643 }
644 function setUserPassword(user, passwd) {
645 return $http({
646 method: 'POST',
647 url: DataService.getHost() +
648 '/xyz/openbmc_project/user/' + user +
649 '/action/SetPassword',
650 withCredentials: true,
651 data: JSON.stringify({'data': [passwd]}),
652 responseType: 'arraybuffer'
653 })
654 .then(function(response) {
655 return response.data;
656 });
657 }
658 var priv = convertRoleIdToPriv(role);
659 return $http({
660 method: 'POST',
661 url: DataService.getHost() +
662 '/xyz/openbmc_project/user/action/CreateUser',
663 withCredentials: true,
664 data: JSON.stringify({
665 'data':
666 [user, ['web', 'redfish', 'ssh'], priv, enabled]
667 }),
668 responseType: 'arraybuffer'
669 })
670 .then(function(response) {
671 return setUserPassword(user, passwd);
672 });
673 }
674 },
675 updateUser: function(user, newUser, passwd, role, enabled) {
676 if (DataService.configJson.redfishSupportEnabled == true) {
677 var data = {};
678 if ((newUser !== undefined) && (newUser != null)) {
679 data['UserName'] = newUser;
680 }
681 if ((role !== undefined) && (role != null)) {
682 data['RoleId'] = role;
683 }
684 if ((enabled !== undefined) && (enabled != null)) {
685 data['Enabled'] = enabled;
686 }
687 if ((passwd !== undefined) && (passwd != null)) {
688 data['Password'] = passwd;
689 }
690 return $http({
691 method: 'PATCH',
692 url: DataService.getHost() +
693 '/redfish/v1/AccountService/Accounts/' + user,
694 withCredentials: true,
695 data: data
696 });
697 } else {
698 var deferred = $q.defer();
699 var promises = [];
700 function convertRoleIdToPriv(roleId) {
701 if (roleId == 'Administrator') {
702 return 'priv-admin';
703 } else if (roleId == 'User') {
704 return 'priv-user';
705 } else if (roleId == 'Operator') {
706 return 'priv-operator';
707 } else if (roleId == 'Callback') {
708 return 'priv-callback';
709 }
710 return '';
711 }
712 function setUserProperty(user, propKey, propVal) {
713 return $http({
714 method: 'PUT',
715 url: DataService.getHost() +
716 '/xyz/openbmc_project/user/' + user + '/attr/' +
717 propKey,
718 withCredentials: true,
719 data: JSON.stringify({'data': propVal})
720 })
721 .then(function(response) {
722 return response.data;
723 });
724 }
725 function setUserPassword(user, passwd) {
726 return $http({
727 method: 'POST',
728 url: DataService.getHost() +
729 '/xyz/openbmc_project/user/' + user +
730 '/action/SetPassword',
731 withCredentials: true,
732 data: JSON.stringify({'data': [passwd]}),
733 responseType: 'arraybuffer'
734 })
735 .then(function(response) {
736 return response.data;
737 });
738 }
739 function renameUser(user, newUser) {
740 return $http({
741 method: 'POST',
742 url: DataService.getHost() +
743 '/xyz/openbmc_project/user/action/RenameUser',
744 withCredentials: true,
745 data: JSON.stringify({'data': [user, newUser]})
746 })
747 .then(function(response) {
748 return response.data;
749 });
750 }
751 if ((role !== undefined) && (role != null)) {
752 var priv = convertRoleIdToPriv(role);
753 promises.push(setUserProperty(user, 'UserPrivilege', priv));
754 }
755 if ((enabled !== undefined) && (enabled != null)) {
756 promises.push(setUserProperty(user, 'UserEnabled', enabled));
757 }
758 if ((passwd !== undefined) && (passwd != null)) {
759 promises.push(setUserPassword(user, passwd));
760 }
761 if ((newUser !== undefined) && (newUser != null)) {
762 promises.push(renameUser(user, newUser));
763 }
764 $q.all(promises).then(
765 function(results) {
766 deferred.resolve(results);
767 },
768 function(errors) {
769 deferred.reject(errors);
770 });
771 return deferred.promise;
772 }
773 },
774 deleteUser: function(user) {
775 if (DataService.configJson.redfishSupportEnabled == true) {
776 return $http({
777 method: 'DELETE',
778 url: DataService.getHost() +
779 '/redfish/v1/AccountService/Accounts/' + user,
780 withCredentials: true,
781 });
782 } else {
783 return $http({
784 method: 'POST',
785 url: DataService.getHost() + '/xyz/openbmc_project/user/' +
786 user + '/action/Delete',
787 withCredentials: true,
788 data: JSON.stringify({'data': []})
789 })
790 .then(function(response) {
791 return response.data;
792 });
793 }
794 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700795 chassisPowerOff: function() {
796 var deferred = $q.defer();
797 $http({
798 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700799 url: DataService.getHost() +
800 '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700801 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700802 data: JSON.stringify(
803 {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
804 })
805 .then(
806 function(response) {
807 var json = JSON.stringify(response.data);
808 var content = JSON.parse(json);
809 deferred.resolve(content.status);
810 },
811 function(error) {
812 console.log(error);
813 deferred.reject(error);
814 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700815 return deferred.promise;
816 },
817 setLEDState: function(state, callback) {
818 $http({
819 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700820 url: DataService.getHost() +
821 '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700822 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700823 data: JSON.stringify({'data': state})
824 })
825 .then(
826 function(response) {
827 var json = JSON.stringify(response.data);
828 var content = JSON.parse(json);
829 if (callback) {
830 return callback(content.status);
831 }
832 },
833 function(error) {
834 if (callback) {
835 callback(error);
836 } else {
837 console.log(error);
838 }
839 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700840 },
841 bmcReboot: function(callback) {
842 $http({
843 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700844 url: DataService.getHost() +
845 '/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700846 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700847 data: JSON.stringify(
848 {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
849 })
850 .then(
851 function(response) {
852 var json = JSON.stringify(response.data);
853 var content = JSON.parse(json);
854 if (callback) {
855 return callback(content.status);
856 }
857 },
858 function(error) {
859 if (callback) {
860 callback(error);
861 } else {
862 console.log(error);
863 }
864 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700865 },
beccabroekbfc99902018-07-24 15:36:33 -0500866 getLastRebootTime: function() {
867 return $http({
868 method: 'GET',
869 url: DataService.getHost() +
870 '/xyz/openbmc_project/state/bmc0/attr/LastRebootTime',
beccabroekbfc99902018-07-24 15:36:33 -0500871 withCredentials: true
872 })
873 .then(function(response) {
874 return response.data;
875 });
876 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700877 hostPowerOn: function() {
878 var deferred = $q.defer();
879 $http({
880 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700881 url: DataService.getHost() +
882 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700883 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700884 data: JSON.stringify(
885 {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
886 })
887 .then(
888 function(response) {
889 var json = JSON.stringify(response.data);
890 var content = JSON.parse(json);
891 deferred.resolve(content.status);
892 },
893 function(error) {
894 console.log(error);
895 deferred.reject(error);
896 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700897 return deferred.promise;
898 },
899 hostPowerOff: function() {
900 var deferred = $q.defer();
901 $http({
902 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700903 url: DataService.getHost() +
904 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700905 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700906 data: JSON.stringify(
907 {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
908 })
909 .then(
910 function(response) {
911 var json = JSON.stringify(response.data);
912 var content = JSON.parse(json);
913 deferred.resolve(content.status);
914 },
915 function(error) {
916 console.log(error);
917 deferred.reject(error);
918 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700919 return deferred.promise;
920 },
921 hostReboot: function() {
922 var deferred = $q.defer();
923 $http({
924 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700925 url: DataService.getHost() +
926 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700927 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700928 data: JSON.stringify(
929 {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
930 })
931 .then(
932 function(response) {
933 var json = JSON.stringify(response.data);
934 var content = JSON.parse(json);
935 deferred.resolve(content.status);
936 },
937 function(error) {
938 console.log(error);
939 deferred.reject(error);
940 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700941
942 return deferred.promise;
943 },
944 hostShutdown: function(callback) {
945 $http({
946 method: 'POST',
947 url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700948 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700949 data: JSON.stringify({'data': []})
950 })
951 .then(
952 function(response) {
953 var json = JSON.stringify(response.data);
954 var content = JSON.parse(json);
955 if (callback) {
956 return callback(content);
957 }
958 },
959 function(error) {
960 if (callback) {
961 callback(error);
962 } else {
963 console.log(error);
964 }
965 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700966 },
beccabroek56744252018-08-03 11:25:11 -0500967 getLastPowerTime: function() {
968 return $http({
969 method: 'GET',
970 url: DataService.getHost() +
971 '/xyz/openbmc_project/state/chassis0/attr/LastStateChangeTime',
beccabroek56744252018-08-03 11:25:11 -0500972 withCredentials: true
973 })
974 .then(function(response) {
975 return response.data;
976 });
977 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700978 getLogs: function() {
979 var deferred = $q.defer();
980 $http({
981 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700982 url: DataService.getHost() +
983 '/xyz/openbmc_project/logging/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700984 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700985 })
986 .then(
987 function(response) {
988 var json = JSON.stringify(response.data);
989 var content = JSON.parse(json);
990 var dataClone = JSON.parse(JSON.stringify(content.data));
991 var data = [];
992 var severityCode = '';
993 var priority = '';
994 var health = '';
995 var relatedItems = [];
Matt Spinler845acdc2018-05-01 16:41:28 -0500996 var eventID = 'None';
997 var description = 'None';
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('Id')) {
1002 var severityFlags = {
1003 low: false,
1004 medium: false,
1005 high: false
1006 };
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001007 severityCode =
1008 content.data[key].Severity.split('.').pop();
1009 priority =
1010 Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
1011 severityFlags[priority.toLowerCase()] = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001012 relatedItems = [];
1013 content.data[key].associations.forEach(function(item) {
1014 relatedItems.push(item[2]);
1015 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001016
Matt Spinler845acdc2018-05-01 16:41:28 -05001017 if (content.data[key].hasOwnProperty(['EventID'])) {
1018 eventID = content.data[key].EventID;
1019 }
1020
1021 if (content.data[key].hasOwnProperty(['Description'])) {
1022 description = content.data[key].Description;
1023 }
1024
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001025 data.push(Object.assign(
1026 {
1027 path: key,
1028 copied: false,
1029 priority: priority,
1030 severity_code: severityCode,
1031 severity_flags: severityFlags,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001032 additional_data:
1033 content.data[key].AdditionalData.join('\n'),
1034 type: content.data[key].Message,
1035 selected: false,
1036 search_text:
1037 ('#' + content.data[key].Id + ' ' +
1038 severityCode + ' ' +
Gunnar Mills07876ff2018-06-28 15:21:22 -05001039 content.data[key].Message + ' ' +
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001040 content.data[key].Severity + ' ' +
1041 content.data[key].AdditionalData.join(' '))
1042 .toLowerCase(),
1043 meta: false,
1044 confirm: false,
1045 related_items: relatedItems,
Matt Spinler845acdc2018-05-01 16:41:28 -05001046 eventID: eventID,
1047 description: description,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001048 data: {key: key, value: content.data[key]}
1049 },
1050 content.data[key]));
1051 }
1052 }
1053 deferred.resolve({data: data, original: dataClone});
1054 },
1055 function(error) {
1056 console.log(error);
1057 deferred.reject(error);
1058 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001059
1060 return deferred.promise;
1061 },
1062 getAllSensorStatus: function(callback) {
1063 $http({
1064 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001065 url: DataService.getHost() +
1066 '/xyz/openbmc_project/sensors/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001067 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001068 })
1069 .then(
1070 function(response) {
1071 var json = JSON.stringify(response.data);
1072 var content = JSON.parse(json);
1073 var dataClone = JSON.parse(JSON.stringify(content.data));
1074 var sensorData = [];
1075 var severity = {};
1076 var title = '';
1077 var tempKeyParts = [];
1078 var order = 0;
1079 var customOrder = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001080
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001081 function getSensorStatus(reading) {
1082 var severityFlags = {
1083 critical: false,
1084 warning: false,
1085 normal: false
1086 },
1087 severityText = '', order = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001088
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001089 if (reading.hasOwnProperty('CriticalLow') &&
1090 reading.Value < reading.CriticalLow) {
1091 severityFlags.critical = true;
1092 severityText = 'critical';
1093 order = 2;
1094 } else if (
1095 reading.hasOwnProperty('CriticalHigh') &&
1096 reading.Value > reading.CriticalHigh) {
1097 severityFlags.critical = true;
1098 severityText = 'critical';
1099 order = 2;
1100 } else if (
1101 reading.hasOwnProperty('CriticalLow') &&
1102 reading.hasOwnProperty('WarningLow') &&
1103 reading.Value >= reading.CriticalLow &&
1104 reading.Value <= reading.WarningLow) {
1105 severityFlags.warning = true;
1106 severityText = 'warning';
1107 order = 1;
1108 } else if (
1109 reading.hasOwnProperty('WarningHigh') &&
1110 reading.hasOwnProperty('CriticalHigh') &&
1111 reading.Value >= reading.WarningHigh &&
1112 reading.Value <= reading.CriticalHigh) {
1113 severityFlags.warning = true;
1114 severityText = 'warning';
1115 order = 1;
1116 } else {
1117 severityFlags.normal = true;
1118 severityText = 'normal';
1119 }
1120 return {
1121 flags: severityFlags,
1122 severityText: severityText,
1123 order: order
1124 };
1125 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001126
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001127 for (var key in content.data) {
1128 if (content.data.hasOwnProperty(key) &&
1129 content.data[key].hasOwnProperty('Unit')) {
1130 severity = getSensorStatus(content.data[key]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001131
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001132 if (!content.data[key].hasOwnProperty('CriticalLow')) {
1133 content.data[key].CriticalLow = '--';
1134 content.data[key].CriticalHigh = '--';
1135 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001136
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001137 if (!content.data[key].hasOwnProperty('WarningLow')) {
1138 content.data[key].WarningLow = '--';
1139 content.data[key].WarningHigh = '--';
1140 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001141
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001142 tempKeyParts = key.split('/');
1143 title = tempKeyParts.pop();
1144 title = tempKeyParts.pop() + '_' + title;
1145 title = title.split('_')
1146 .map(function(item) {
1147 return item.toLowerCase()
1148 .charAt(0)
1149 .toUpperCase() +
1150 item.slice(1);
1151 })
1152 .reduce(function(prev, el) {
1153 return prev + ' ' + el;
1154 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001155
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001156 content.data[key].Value = getScaledValue(
1157 content.data[key].Value, content.data[key].Scale);
1158 content.data[key].CriticalLow = getScaledValue(
1159 content.data[key].CriticalLow,
1160 content.data[key].Scale);
1161 content.data[key].CriticalHigh = getScaledValue(
1162 content.data[key].CriticalHigh,
1163 content.data[key].Scale);
1164 content.data[key].WarningLow = getScaledValue(
1165 content.data[key].WarningLow,
1166 content.data[key].Scale);
1167 content.data[key].WarningHigh = getScaledValue(
1168 content.data[key].WarningHigh,
1169 content.data[key].Scale);
1170 if (Constants.SENSOR_SORT_ORDER.indexOf(
1171 content.data[key].Unit) > -1) {
1172 customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
1173 content.data[key].Unit);
1174 } else {
1175 customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
1176 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001177
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001178 sensorData.push(Object.assign(
1179 {
1180 path: key,
1181 selected: false,
1182 confirm: false,
1183 copied: false,
1184 title: title,
1185 unit:
1186 Constants
1187 .SENSOR_UNIT_MAP[content.data[key].Unit],
1188 severity_flags: severity.flags,
1189 status: severity.severityText,
1190 order: severity.order,
1191 custom_order: customOrder,
1192 search_text:
1193 (title + ' ' + content.data[key].Value + ' ' +
1194 Constants.SENSOR_UNIT_MAP[content.data[key]
1195 .Unit] +
1196 ' ' + severity.severityText + ' ' +
1197 content.data[key].CriticalLow + ' ' +
1198 content.data[key].CriticalHigh + ' ' +
1199 content.data[key].WarningLow + ' ' +
1200 content.data[key].WarningHigh + ' ')
1201 .toLowerCase(),
1202 original_data:
1203 {key: key, value: content.data[key]}
1204 },
1205 content.data[key]));
1206 }
1207 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001208
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001209 callback(sensorData, dataClone);
1210 },
1211 function(error) {
1212 console.log(error);
1213 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001214 },
1215 getActivation: function(imageId) {
1216 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001217 method: 'GET',
1218 url: DataService.getHost() +
1219 '/xyz/openbmc_project/software/' + imageId +
1220 '/attr/Activation',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001221 withCredentials: true
1222 })
1223 .then(function(response) {
1224 return response.data;
1225 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001226 },
1227 getFirmwares: function() {
1228 var deferred = $q.defer();
1229 $http({
1230 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001231 url: DataService.getHost() +
1232 '/xyz/openbmc_project/software/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001233 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001234 })
1235 .then(
1236 function(response) {
1237 var json = JSON.stringify(response.data);
1238 var content = JSON.parse(json);
1239 var data = [];
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001240 var isExtended = false;
1241 var bmcActiveVersion = '';
1242 var hostActiveVersion = '';
1243 var imageType = '';
1244 var extendedVersions = [];
1245 var functionalImages = [];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001246
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001247 function getFormatedExtendedVersions(extendedVersion) {
1248 var versions = [];
1249 extendedVersion = extendedVersion.split(',');
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001250
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001251 extendedVersion.forEach(function(item) {
1252 var parts = item.split('-');
1253 var numberIndex = 0;
1254 for (var i = 0; i < parts.length; i++) {
1255 if (/[0-9]/.test(parts[i])) {
1256 numberIndex = i;
1257 break;
1258 }
1259 }
1260 var titlePart = parts.splice(0, numberIndex);
1261 titlePart = titlePart.join('');
1262 titlePart = titlePart[0].toUpperCase() +
1263 titlePart.substr(1, titlePart.length);
1264 var versionPart = parts.join('-');
1265 versions.push({title: titlePart, version: versionPart});
1266 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001267
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001268 return versions;
1269 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001270
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001271 // Get the list of functional images so we can compare
1272 // later if an image is functional
1273 if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
1274 functionalImages =
1275 content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
1276 .endpoints;
1277 }
1278 for (var key in content.data) {
1279 if (content.data.hasOwnProperty(key) &&
1280 content.data[key].hasOwnProperty('Version')) {
Gunnar Millsac9131e2018-07-13 15:52:18 -05001281 var activationStatus = '';
1282
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001283 // If the image is "Functional" use that for the
AppaRao Puli28711a62018-10-17 16:07:55 +05301284 // activation status, else use the value of
1285 // "Activation"
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001286 // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
Gunnar Millsac9131e2018-07-13 15:52:18 -05001287 if (content.data[key].Activation) {
1288 activationStatus =
1289 content.data[key].Activation.split('.').pop();
1290 }
1291
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001292 if (functionalImages.includes(key)) {
1293 activationStatus = 'Functional';
1294 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001295
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001296 imageType = content.data[key].Purpose.split('.').pop();
1297 isExtended = content.data[key].hasOwnProperty(
1298 'ExtendedVersion') &&
1299 content.data[key].ExtendedVersion != '';
1300 if (isExtended) {
1301 extendedVersions = getFormatedExtendedVersions(
1302 content.data[key].ExtendedVersion);
1303 }
1304 data.push(Object.assign(
1305 {
1306 path: key,
1307 activationStatus: activationStatus,
1308 imageId: key.split('/').pop(),
1309 imageType: imageType,
1310 isExtended: isExtended,
1311 extended:
1312 {show: false, versions: extendedVersions},
1313 data: {key: key, value: content.data[key]}
1314 },
1315 content.data[key]));
1316
1317 if (activationStatus == 'Functional' &&
1318 imageType == 'BMC') {
1319 bmcActiveVersion = content.data[key].Version;
1320 }
1321
1322 if (activationStatus == 'Functional' &&
1323 imageType == 'Host') {
1324 hostActiveVersion = content.data[key].Version;
1325 }
1326 }
1327 }
1328
1329 deferred.resolve({
1330 data: data,
1331 bmcActiveVersion: bmcActiveVersion,
1332 hostActiveVersion: hostActiveVersion
1333 });
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001334 },
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001335 function(error) {
1336 console.log(error);
1337 deferred.reject(error);
1338 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001339
1340 return deferred.promise;
1341 },
1342 changePriority: function(imageId, priority) {
1343 var deferred = $q.defer();
1344 $http({
1345 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001346 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1347 imageId + '/attr/Priority',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001348 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001349 data: JSON.stringify({'data': priority})
1350 })
1351 .then(
1352 function(response) {
1353 var json = JSON.stringify(response.data);
1354 var content = JSON.parse(json);
1355 deferred.resolve(content);
1356 },
1357 function(error) {
1358 console.log(error);
1359 deferred.reject(error);
1360 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001361
1362 return deferred.promise;
1363 },
1364 deleteImage: function(imageId) {
1365 var deferred = $q.defer();
1366 $http({
1367 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001368 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1369 imageId + '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001370 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001371 data: JSON.stringify({'data': []})
1372 })
1373 .then(
1374 function(response) {
1375 var json = JSON.stringify(response.data);
1376 var content = JSON.parse(json);
1377 deferred.resolve(content);
1378 },
1379 function(error) {
1380 console.log(error);
1381 deferred.reject(error);
1382 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001383
1384 return deferred.promise;
1385 },
1386 activateImage: function(imageId) {
1387 var deferred = $q.defer();
1388 $http({
1389 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001390 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1391 imageId + '/attr/RequestedActivation',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001392 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001393 data:
1394 JSON.stringify({'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1395 })
1396 .then(
1397 function(response) {
1398 var json = JSON.stringify(response.data);
1399 var content = JSON.parse(json);
1400 deferred.resolve(content);
1401 },
1402 function(error) {
1403 console.log(error);
1404 deferred.reject(error);
1405 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001406
1407 return deferred.promise;
1408 },
1409 uploadImage: function(file) {
1410 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001411 method: 'POST',
1412 timeout: 5 * 60 * 1000,
1413 url: DataService.getHost() + '/upload/image',
Gunnar Millsdd9d4c32018-09-10 12:59:34 -05001414 // Overwrite the default 'application/json' Content-Type
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001415 headers: {'Content-Type': 'application/octet-stream'},
1416 withCredentials: true,
1417 data: file
1418 })
1419 .then(function(response) {
1420 return response.data;
1421 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001422 },
1423 downloadImage: function(host, filename) {
1424 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001425 method: 'POST',
1426 url: DataService.getHost() +
1427 '/xyz/openbmc_project/software/action/DownloadViaTFTP',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001428 withCredentials: true,
1429 data: JSON.stringify({'data': [filename, host]}),
1430 responseType: 'arraybuffer'
1431 })
1432 .then(function(response) {
1433 return response.data;
1434 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001435 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001436 getServerInfo: function() {
1437 // TODO: openbmc/openbmc#3117 Need a way via REST to get
1438 // interfaces so we can get the system object(s) by the looking
1439 // for the system interface.
1440 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001441 method: 'GET',
1442 url: DataService.getHost() +
1443 '/xyz/openbmc_project/inventory/system',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001444 withCredentials: true
1445 })
1446 .then(function(response) {
1447 return response.data;
1448 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001449 },
1450 getBMCTime: function() {
1451 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001452 method: 'GET',
1453 url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001454 withCredentials: true
1455 })
1456 .then(function(response) {
1457 return response.data;
1458 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001459 },
Gunnar Millsc74d4342018-07-18 14:52:02 -05001460 getTime: function() {
1461 return $http({
1462 method: 'GET',
1463 url: DataService.getHost() +
1464 '/xyz/openbmc_project/time/enumerate',
Gunnar Millsc74d4342018-07-18 14:52:02 -05001465 withCredentials: true
1466 })
1467 .then(function(response) {
1468 return response.data;
1469 });
1470 },
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001471 // Even though NTPServers is a network interface specific path
1472 // (e.g. /xyz/openbmc_project/network/eth0/attr/NTPServers) it acts
1473 // like a global setting. Just use eth0 for setting and getting the
1474 // NTP Servers until it is moved to a non-network interface specific
1475 // path like it is in Redfish. TODO: openbmc/phosphor-time-manager#4
1476 getNTPServers: function() {
1477 return $http({
1478 method: 'GET',
1479 url: DataService.getHost() +
1480 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001481 withCredentials: true
1482 })
1483 .then(function(response) {
1484 return response.data;
1485 });
1486 },
1487 setNTPServers: function(ntpServers) {
1488 return $http({
1489 method: 'PUT',
1490 url: DataService.getHost() +
1491 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001492 withCredentials: true,
1493 data: JSON.stringify({'data': ntpServers})
1494 })
1495 .then(function(response) {
1496 return response.data;
1497 });
1498 },
1499 setTimeMode: function(timeMode) {
1500 return $http({
1501 method: 'PUT',
1502 url: DataService.getHost() +
1503 '/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001504 withCredentials: true,
1505 data: JSON.stringify({'data': timeMode})
1506 })
1507 .then(function(response) {
1508 return response.data;
1509 });
1510 },
1511 setTimeOwner: function(timeOwner) {
1512 return $http({
1513 method: 'PUT',
1514 url: DataService.getHost() +
1515 '/xyz/openbmc_project/time/owner/attr/TimeOwner',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001516 withCredentials: true,
1517 data: JSON.stringify({'data': timeOwner})
1518 })
1519 .then(function(response) {
1520 return response.data;
1521 });
1522 },
1523 setBMCTime: function(time) {
1524 return $http({
1525 method: 'PUT',
1526 url: DataService.getHost() +
1527 '/xyz/openbmc_project/time/bmc/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001528 withCredentials: true,
1529 data: JSON.stringify({'data': time})
1530 })
1531 .then(function(response) {
1532 return response.data;
1533 });
1534 },
1535 setHostTime: function(time) {
1536 return $http({
1537 method: 'PUT',
1538 url: DataService.getHost() +
1539 '/xyz/openbmc_project/time/host/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001540 withCredentials: true,
1541 data: JSON.stringify({'data': time})
1542 })
1543 .then(function(response) {
1544 return response.data;
1545 });
1546 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001547 getHardwares: function(callback) {
1548 $http({
1549 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001550 url: DataService.getHost() +
1551 '/xyz/openbmc_project/inventory/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001552 withCredentials: true
1553 }).then(function(response) {
1554 var json = JSON.stringify(response.data);
1555 var content = JSON.parse(json);
1556 var hardwareData = [];
1557 var keyIndexMap = {};
1558 var title = '';
beccabroek628ba8b2018-10-01 14:12:25 -05001559 var depth = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001560 var data = [];
1561 var searchText = '';
1562 var componentIndex = -1;
beccabroek628ba8b2018-10-01 14:12:25 -05001563 var parent = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001564
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001565 function isSubComponent(key) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001566 for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1567 i++) {
1568 if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1569 2)
1570 return true;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001571 }
1572
1573 return false;
1574 }
1575
1576 function titlelize(title) {
1577 title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001578 for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1579 i++) {
1580 if (title.toLowerCase().indexOf(
1581 (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001582 return title.toUpperCase();
1583 }
1584 }
1585
1586 return title;
1587 }
1588
1589 function camelcaseToLabel(obj) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001590 var transformed = [], label = '', value = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001591 for (var key in obj) {
1592 label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1593 if (obj[key] !== '') {
1594 value = obj[key];
1595 if (value == 1 || value == 0) {
1596 value = (value == 1) ? 'Yes' : 'No';
1597 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001598 transformed.push({key: label, value: value});
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001599 }
1600 }
1601
1602 return transformed;
1603 }
1604
beccabroek628ba8b2018-10-01 14:12:25 -05001605 function determineParent(key) {
1606 var levels = key.split('/');
1607 levels.pop();
1608 return levels.join('/');
1609 }
1610
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001611 function getSearchText(data) {
1612 var searchText = '';
1613 for (var i = 0; i < data.length; i++) {
1614 searchText += ' ' + data[i].key + ' ' + data[i].value;
1615 }
1616
1617 return searchText;
1618 }
1619
1620 for (var key in content.data) {
1621 if (content.data.hasOwnProperty(key) &&
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001622 key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001623 data = camelcaseToLabel(content.data[key]);
1624 searchText = getSearchText(data);
1625 title = key.split('/').pop();
1626
1627 title = titlelize(title);
beccabroek628ba8b2018-10-01 14:12:25 -05001628 // e.g. /xyz/openbmc_project/inventory/system and
1629 // /xyz/openbmc_project/inventory/system/chassis are depths of 5
1630 // and 6.
1631 depth = key.split('/').length;
1632 parent = determineParent(key);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001633
1634 if (!isSubComponent(key)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001635 hardwareData.push(Object.assign(
1636 {
1637 path: key,
1638 title: title,
beccabroek628ba8b2018-10-01 14:12:25 -05001639 depth: depth,
1640 parent: parent,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001641 selected: false,
1642 expanded: false,
1643 search_text: title.toLowerCase() + ' ' +
1644 searchText.toLowerCase(),
1645 sub_components: [],
1646 original_data: {key: key, value: content.data[key]}
1647 },
1648 {items: data}));
Iftekharul Islam2a489552017-11-02 13:23:08 -05001649
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001650 keyIndexMap[key] = hardwareData.length - 1;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001651 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001652 parent = determineParent(key)
1653 componentIndex = keyIndexMap[parent];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001654 data = content.data[key];
1655 data.title = title;
1656 hardwareData[componentIndex].sub_components.push(data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001657 hardwareData[componentIndex].search_text +=
1658 ' ' + title.toLowerCase();
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001659
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001660 // Sort the subcomponents alphanumeric so they are displayed
1661 // on the inventory page in order (e.g. core 0, core 1, core
1662 // 2, ... core 12, core 13)
1663 hardwareData[componentIndex].sub_components.sort(function(
1664 a, b) {
1665 return a.title.localeCompare(
1666 b.title, 'en', {numeric: true});
Gunnar Mills55a8e392018-03-14 15:37:44 -05001667 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001668 }
1669 }
1670 }
beccabroek628ba8b2018-10-01 14:12:25 -05001671 // First, order the components by depth and then place the child
1672 // components beneath their parent component alphanumerically. Can
1673 // be removed with completion of
1674 // https://github.com/openbmc/openbmc/issues/3401
1675 // TODO: Remove this once implemented in back end
1676 hardwareData.sort(function(a, b) {
1677 if (a.depth < b.depth) return -1;
1678 if (a.depth > b.depth) return 1;
1679 return b.title.localeCompare(a.title, 'en', {numeric: true});
1680 });
1681
1682 var orderedComponents = [];
1683
1684 for (var i = 0; i < hardwareData.length; i++) {
1685 if (!keyIndexMap[hardwareData[i].parent]) {
1686 orderedComponents.push(hardwareData[i]);
1687 } else {
1688 for (var j = 0; j < orderedComponents.length; j++) {
1689 if (orderedComponents[j].path === hardwareData[i].parent) {
1690 var child = hardwareData[i];
1691 orderedComponents.splice(j + 1, 0, child);
1692 }
1693 }
1694 }
1695 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001696
1697 if (callback) {
beccabroek628ba8b2018-10-01 14:12:25 -05001698 callback(orderedComponents, content.data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001699 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001700 return {data: orderedComponents, original_data: content.data};
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001701 }
1702 });
1703 },
1704 deleteLogs: function(logs) {
1705 var defer = $q.defer();
1706 var promises = [];
1707
1708 function finished() {
1709 defer.resolve();
1710 }
1711
1712 logs.forEach(function(item) {
1713 promises.push($http({
1714 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001715 url: DataService.getHost() +
1716 '/xyz/openbmc_project/logging/entry/' + item.Id +
1717 '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001718 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001719 data: JSON.stringify({'data': []})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001720 }));
1721 });
1722
1723 $q.all(promises).then(finished);
1724
1725 return defer.promise;
1726 },
1727 resolveLogs: function(logs) {
1728 var defer = $q.defer();
1729 var promises = [];
1730
1731 function finished() {
1732 defer.resolve();
1733 }
1734
1735 logs.forEach(function(item) {
1736 promises.push($http({
1737 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001738 url: DataService.getHost() +
1739 '/xyz/openbmc_project/logging/entry/' + item.Id +
1740 '/attr/Resolved',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001741 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001742 data: JSON.stringify({'data': '1'})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001743 }));
1744 });
Iftekharul Islama1d238f2018-02-26 12:29:45 -06001745
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001746 $q.all(promises).then(finished);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001747
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001748 return defer.promise;
1749 },
1750 getPowerConsumption: function() {
1751 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001752 method: 'GET',
1753 url: DataService.getHost() +
1754 '/xyz/openbmc_project/sensors/power/total_power',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001755 withCredentials: true
1756 })
1757 .then(
1758 function(response) {
1759 var json = JSON.stringify(response.data);
1760 var content = JSON.parse(json);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001761
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001762 return getScaledValue(
1763 content.data.Value, content.data.Scale) +
1764 ' ' +
1765 Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1766 },
1767 function(error) {
1768 if ('Not Found' == error.statusText) {
1769 return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1770 } else {
1771 throw error;
1772 }
1773 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001774 },
1775 getPowerCap: function() {
1776 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001777 method: 'GET',
1778 url: DataService.getHost() +
1779 '/xyz/openbmc_project/control/host0/power_cap',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001780 withCredentials: true
1781 })
1782 .then(function(response) {
Gunnar Mills006aaa02018-06-26 16:08:59 -05001783 return response.data;
1784 });
1785 },
1786 setPowerCapEnable: function(powerCapEnable) {
1787 return $http({
1788 method: 'PUT',
1789 url: DataService.getHost() +
1790 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCapEnable',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001791 withCredentials: true,
1792 data: JSON.stringify({'data': powerCapEnable})
1793 })
1794 .then(function(response) {
1795 return response.data;
1796 });
1797 },
1798 setPowerCap: function(powerCap) {
1799 return $http({
1800 method: 'PUT',
1801 url: DataService.getHost() +
1802 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCap',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001803 withCredentials: true,
1804 data: JSON.stringify({'data': powerCap})
1805 })
1806 .then(function(response) {
1807 return response.data;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001808 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001809 },
1810 setHostname: function(hostname) {
1811 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001812 method: 'PUT',
1813 url: DataService.getHost() +
1814 '/xyz/openbmc_project/network/config/attr/HostName',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001815 withCredentials: true,
1816 data: JSON.stringify({'data': hostname})
1817 })
1818 .then(function(response) {
1819 return response.data;
1820 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001821 },
1822 };
1823 return SERVICE;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001824 }
1825 ]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001826})(window.angular);